Автор | Сообщение |
|
Отправлено: 17.04.21 09:01. Заголовок: find и count
Добрый день! Помогите разобраться, почему ответы при использовании find и count различны. Исходный файл в 24 задании - 24-J4.txt Всем заранее СПАСИБО! Александр. 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
|
|
|
Ответов - 11
[только новые]
|
|
|
Отправлено: 17.04.21 09:03. Заголовок: Дополню - Python 3.4..
Дополню - Python 3.4.3
|
|
|
|
| Администратор
|
Сообщение: 2711
|
|
Отправлено: 17.04.21 09:55. Заголовок: Осипкин пишет: k =..
Осипкин пишет: цитата: | 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 - как можно это объяснить? Пусть s = 'BOSSBOSSB'. Очевидно, что подстрока 'BOSSB' тут встречается 1 раз. По вашему алгоритму в цикле второй раз поиск выполняется в строке 'OSSBOSSB' и мы находим вторую такую подстроку (ее считать не нужно, потому что она перекрывается с первой). Если написать k1 = k2 + 5 (длина 'BOSSB'), то все работает правильно.
|
|
|
|
Отправлено: 17.04.21 10:33. Заголовок: Я считаю, что в Ваше..
Я считаю, что в Вашем примере подстрока 'BOSSB' встречается 2 раза, с 0-й позиции и с 4-й позиции. Да, такая подстрока ("BOSSBOSSB") встречается один раз в Вашем файле. А если считать как Вы, то тогда, мне кажется, ответ в Вашем примере неправильный. Должен быть 2197 (вместо 2198).
|
|
|
|
Отправлено: 17.04.21 11:10. Заголовок: Спасибо большое! Я ..
Спасибо большое! Я понял главное - как работает count. Например, в последовательности "мамамама' я бы нашел 3 подпоследовательности 'мама', count находит только две... Вот так он работает! Просто, если в Вашей задаче подсчитать, используя count сумму s.count(*BOSS*), где под "*" подразумеваются буквы B,O,S, то получим ответ 2197. Я бы тему закрыл. Еще раз спасибо! Александр.
|
|
|
|
| Администратор
|
Сообщение: 2712
|
|
Отправлено: 17.04.21 15:45. Заголовок: Осипкин пишет: в Ваш..
Осипкин пишет: цитата: | в Вашем примере подстрока 'BOSSB' встречается 2 раза, с 0-й позиции и с 4-й позиции |
|
А это смотря что нам нужно. Главное - сначала договориться, учитываем ли мы перекрывающиеся строки. цитата: | А если считать как Вы, то тогда, мне кажется, ответ в Вашем примере неправильный. Должен быть 2197 (вместо 2198). |
|
Не понял почему. цитата: | подсчитать, используя count сумму s.count(*BOSS*), где под "*" подразумеваются буквы B,O,S, то получим ответ 2197 |
|
Почему так нужно считать? Вот решение, которое есть на сайте: print(s.count('BOSS') - s.count('JBOSS') - s.count('BOSSJ') + s.count('JBOSSJ')) Здесь есть ошибка?
|
|
|
|
Отправлено: 18.04.21 14:39. Заголовок: Добрый день! А в чем..
Добрый день! А в чем ошибка в моем алгоритме? Необходимо рассмотреть последовательности: -BOSS (в начале строки и после слова нет буквы J) -BOSS (в конце строки и перед словом нет буквы J) Эти два варианта отбросим, т.к. визуально видно, что таких случаев нет! -BOSS в середине строки, причем в одном из девяти видов BBOSSВ, BBOSSO, BBOSSS, OBOSSВ, OBOSSO, OBOSSS,SBOSSВ, SBOSSO, SBOSSS. И в этом случае посчитать сумму COUNT-ов этих девяти вариантов. И ответ будет 2197. Где у меня ошибка в рассуждениях? А вывод - надо аккуратно использовать стандартные функции! И в результате я выяснил, как работает COUNT.
|
|
|
|
| Администратор
|
Сообщение: 2715
|
|
Отправлено: 18.04.21 20:35. Заголовок: Осипкин пишет: BOSS ..
Осипкин пишет: цитата: | BOSS в середине строки, причем в одном из девяти видов BBOSSВ, BBOSSO, BBOSSS, OBOSSВ, OBOSSO, OBOSSS,SBOSSВ, SBOSSO, SBOSSS. |
|
Как все это связано с условием задачи? Там же сказано только о том, что до и после слова не должно быть буквы J.
|
|
|
|
Отправлено: 18.04.21 14:40. Заголовок: А к Вашей программе ..
А к Вашей программе у меня замечаний нет...
|
|
|
|
Отправлено: 20.04.21 05:18. Заголовок: Дважды два не только..
Дважды два не только четыре, но и без пяти трижды три. Георгий Александров. Т.е. Вы считаете, что задачу можно решать только одним способом? Но, если следовать Вашей логике, не получится ли, что в задаче 156, если найдена подстрока AAAA*F, то это всего одна подстрока, а не четыре?
|
|
|
|
| Администратор
|
Сообщение: 2725
|
|
Отправлено: 20.04.21 13:46. Заголовок: Осипкин пишет: Т.е. ..
Осипкин пишет: цитата: | Т.е. Вы считаете, что задачу можно решать только одним способом? |
|
Никак нет. Тут ведь всегда - как договоримся. Какой вариант будем использовать.
|
|
|
|
Отправлено: 20.04.21 13:55. Заголовок: Если рассмотреть стр..
Если рассмотреть строку AAAABF то AF подстрок 4 штуки. Проблема пересекающихся подстрок есть, думается мне что по умолчанию пересекающиеся подстроки должны быть учтены полностью (по задумке, что мы рассматриваем каждую подстроку как ОТДЕЛЬНЫЙ элемент, без контекста других подстрок). Если конечно не указано иного дополнительно.
|
|
|
|