Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 20, 2021 22:12:28

MaxTheAlien
Зарегистрирован: 2021-06-20
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка фйла со строками.

Мне надо было посчитать в файле с различными строками из буква латинского алфавита количество строк, в которых более одного раза встречается фрагмент 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)



У великой идеи нет начала, как идея, она существует всегда.

Прикреплённый файлы:
attachment 24-s1.txt (977,7 KБ)

Офлайн

#2 Июнь 21, 2021 00:23:08

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Обработка фйла со строками.

Используй 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
>>>



Офлайн

#3 Июнь 21, 2021 12:03:28

MaxTheAlien
Зарегистрирован: 2021-06-20
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка фйла со строками.

py.user.next
Используй str.find() .
Интересно, спасибо. Но почему всё-таки моё “if ‘YZ’ in line and ‘YZ’ in line.replace('YZ', '', 1): c += 1” насчитывало на 1 строку больше?



У великой идеи нет начала, как идея, она существует всегда.

Офлайн

#4 Июнь 21, 2021 15:32:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Обработка фйла со строками.

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(), которая остановится при первом же обнаружении подстроки.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version