Форум » Обработка символьных строк » find и count » Ответить

find и count

Осипкин: Добрый день! Помогите разобраться, почему ответы при использовании find и count различны. Исходный файл в 24 задании - 24-J4.txt Всем заранее СПАСИБО! Александр. [pre2] with open("c:\24-J4.txt", "r") as f: s = f.readline().rstrip() k = 0; k1 = 0 while True : k2 = s.find('BOSS',k1) if k2<0 : break k+=1 k1 = k2+1 print(k,s.count('BOSS')) # 3917 3917 k = 0; k1 = 0 while True : k2 = s.find('BOSSB',k1) if k2<0 : break k+=1 k1 = k2+1 print(k,s.count('BOSSB')) # 920 919 - как можно это объяснить? k = 0; k1 = 0 while True : k2 = s.find('BOSSBS',k1) if k2<0 : break k+=1 k1 = k2+1 print(k,s.count('BOSSBS')) # 229 229[/pre2]

Ответов - 11

Осипкин: Дополню - Python 3.4.3

Поляков: Осипкин пишет: [pre2] k = 0; k1 = 0 while True : k2 = s.find('BOSSB',k1) if k2<0 : break k+=1 k1 = k2+1 print(k,s.count('BOSSB')) [/pre2] # 920 919 - как можно это объяснить? Пусть s = 'BOSSBOSSB'. Очевидно, что подстрока 'BOSSB' тут встречается 1 раз. По вашему алгоритму в цикле второй раз поиск выполняется в строке 'OSSBOSSB' и мы находим вторую такую подстроку (ее считать не нужно, потому что она перекрывается с первой). Если написать k1 = k2 + 5 (длина 'BOSSB'), то все работает правильно.

Осипкин: Я считаю, что в Вашем примере подстрока 'BOSSB' встречается 2 раза, с 0-й позиции и с 4-й позиции. Да, такая подстрока ("BOSSBOSSB") встречается один раз в Вашем файле. А если считать как Вы, то тогда, мне кажется, ответ в Вашем примере неправильный. Должен быть 2197 (вместо 2198).


Осипкин: Спасибо большое! Я понял главное - как работает count. Например, в последовательности "мамамама' я бы нашел 3 подпоследовательности 'мама', count находит только две... Вот так он работает! Просто, если в Вашей задаче подсчитать, используя count сумму s.count(*BOSS*), где под "*" подразумеваются буквы B,O,S, то получим ответ 2197. Я бы тему закрыл. Еще раз спасибо! Александр.

Поляков: Осипкин пишет: в Вашем примере подстрока 'BOSSB' встречается 2 раза, с 0-й позиции и с 4-й позиции А это смотря что нам нужно. Главное - сначала договориться, учитываем ли мы перекрывающиеся строки. А если считать как Вы, то тогда, мне кажется, ответ в Вашем примере неправильный. Должен быть 2197 (вместо 2198). Не понял почему. подсчитать, используя count сумму s.count(*BOSS*), где под "*" подразумеваются буквы B,O,S, то получим ответ 2197 Почему так нужно считать? Вот решение, которое есть на сайте: [pre2] print(s.count('BOSS') - s.count('JBOSS') - s.count('BOSSJ') + s.count('JBOSSJ'))[/pre2] Здесь есть ошибка?

Осипкин: Добрый день! А в чем ошибка в моем алгоритме? Необходимо рассмотреть последовательности: -BOSS (в начале строки и после слова нет буквы J) -BOSS (в конце строки и перед словом нет буквы J) Эти два варианта отбросим, т.к. визуально видно, что таких случаев нет! -BOSS в середине строки, причем в одном из девяти видов BBOSSВ, BBOSSO, BBOSSS, OBOSSВ, OBOSSO, OBOSSS,SBOSSВ, SBOSSO, SBOSSS. И в этом случае посчитать сумму COUNT-ов этих девяти вариантов. И ответ будет 2197. Где у меня ошибка в рассуждениях? А вывод - надо аккуратно использовать стандартные функции! И в результате я выяснил, как работает COUNT.

Поляков: Осипкин пишет: BOSS в середине строки, причем в одном из девяти видов BBOSSВ, BBOSSO, BBOSSS, OBOSSВ, OBOSSO, OBOSSS,SBOSSВ, SBOSSO, SBOSSS. Как все это связано с условием задачи? Там же сказано только о том, что до и после слова не должно быть буквы J.

Осипкин: А к Вашей программе у меня замечаний нет...

Осипкин: Дважды два не только четыре, но и без пяти трижды три. Георгий Александров. Т.е. Вы считаете, что задачу можно решать только одним способом? Но, если следовать Вашей логике, не получится ли, что в задаче 156, если найдена подстрока AAAA*F, то это всего одна подстрока, а не четыре?

Поляков: Осипкин пишет: Т.е. Вы считаете, что задачу можно решать только одним способом? Никак нет. Тут ведь всегда - как договоримся. Какой вариант будем использовать.

cabanov.alexey: Если рассмотреть строку AAAABF то AF подстрок 4 штуки. Проблема пересекающихся подстрок есть, думается мне что по умолчанию пересекающиеся подстроки должны быть учтены полностью (по задумке, что мы рассматриваем каждую подстроку как ОТДЕЛЬНЫЙ элемент, без контекста других подстрок). Если конечно не указано иного дополнительно.



полная версия страницы