Найти - Пользователи
Полная версия: Обработка фйла со строками.
Начало » Центр помощи » Обработка фйла со строками.
1
MaxTheAlien
Мне надо было посчитать в файле с различными строками из буква латинского алфавита количество строк, в которых более одного раза встречается фрагмент 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)
py.user.next
Используй 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
>>>
MaxTheAlien
py.user.next
Используй str.find() .
Интересно, спасибо. Но почему всё-таки моё “if ‘YZ’ in line and ‘YZ’ in line.replace('YZ', '', 1): c += 1” насчитывало на 1 строку больше?
py.user.next
MaxTheAlien
Но почему всё-таки моё “if ‘YZ’ in line and ‘YZ’ in line.replace('YZ', '', 1): c += 1” насчитывало на 1 строку больше?
Потому что в 937-ой строке у тебя есть одно вхождение YZ и одно вхождение YYZZ. Когда он заменяет в YYZZ строку YZ на пустоту, там остаётся YZ и таким образом он видит два вхождения YZ. Если бы ты заменял не на пустоту, а на x, например, то всё было бы нормально.

А вообще, у тебя операции затратные, что count(), что replace(), так как они ходят по всей строке, даже когда всё уже найдено. Поэтому и надо использовать find(), которая остановится при первом же обнаружении подстроки.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB