Форум сайта python.su
Мне надо было посчитать в файле с различными строками из буква латинского алфавита количество строк, в которых более одного раза встречается фрагмент YZ. Придумал два способа, по нахождению YZ в строке и в строке с удалённым первым вхождением одновременно и просто по количеству вхождений (результаты c и cc соответственно), но первым результат больше на 1, чем вторым (c = 434 и cc = 433 для моего файла, прикреплю его на всякий). Как думаете, почему так может быть? Спасибо.
F = open ('24-s1.txt') c = cc = 0 for line in F: if 'YZ' in line and 'YZ' in line.replace('YZ', '', 1): c += 1 if line.count('YZ') > 1: cc += 1 print (c, cc)
Прикреплённый файлы: 24-s1.txt (977,7 KБ)
Офлайн
Используй str.find() .
>>> def f(text, sub): ... pos = text.find(sub) ... if pos >= 0: ... return text.find(sub, pos + len(sub)) >= 0 ... else: ... return False ... >>> f('a', 'a') False >>> f('aa', 'a') True >>> f('abcdefghiabcdef', 'abc') True >>> f('abcdefghiabcdef', 'def') True >>> f('abcdefghiabcdef', 'ghi') False >>> >>> def g(): ... lines = [ ... 'abcdefghiabcdefghi', ... 'abcdefghidefghi', ... 'defghiabcdefghi', ... 'abcabc' ... ] ... counted = 0 ... for i in lines: ... counted += f(i, 'abc') ... print(counted) ... >>> g() 2 >>>
Офлайн
py.user.nextИнтересно, спасибо. Но почему всё-таки моё “if ‘YZ’ in line and ‘YZ’ in line.replace('YZ', '', 1): c += 1” насчитывало на 1 строку больше?
Используй str.find() .
Офлайн
MaxTheAlienПотому что в 937-ой строке у тебя есть одно вхождение YZ и одно вхождение YYZZ. Когда он заменяет в YYZZ строку YZ на пустоту, там остаётся YZ и таким образом он видит два вхождения YZ. Если бы ты заменял не на пустоту, а на x, например, то всё было бы нормально.
Но почему всё-таки моё “if ‘YZ’ in line and ‘YZ’ in line.replace('YZ', '', 1): c += 1” насчитывало на 1 строку больше?
Офлайн