TLDR;Значение 1797
получается из числа всех строк, начинающихся с From
.
Множество возможных решений, но самым простым может быть использование str.count(substring)
:
for line in fh:
nline = line.rstrip()
counter1 += line.count(email1)
counter2 += line.count(email2)
counter3 += line.count(email3)
print('\nFirst email:', email1, '=', counter1)
print('Second email:', email2, '=', counter2)
print('Third email:', email3, '=', counter3)
выходы:
First email: gjthomas@iupui.edu = 184
Second email: lance@indiana.edu = 33
Third email: nuno@ufp.pt = 114
Объяснение: Откуда берется значение
1797
?
line.find('gjthomas@iupui.edu')
возвращает позицию (строковый индекс) найденной строки и -1
, если строка не найдена.Таким образом, он всегда возвращает -1
, если 'gjthomas@iupui.edu'
не найден, и 5
в этом случае, если равно найдено:
'From gjthomas@iupui.edu Tue Oct 23 09:23:04 2007\n'
0^^^^^^
1_|||||
2__||||
3___|||
4____||
5_____| starting index of the string is found
Теперь сложная часть этого питона Проверка значения истины состояния:
По умолчанию объект считается истинным, если в его классе не определен либо метод __bool__()
, который возвращает False, либо метод __len__()
, который возвращает ноль,при вызове с объектом.
Так что для каждой строки, которую делает , начинается с From
, тогда следующая строка оценивается:
if line.find(email1): # both cases if `-1` if `5` evaluate to Truthy value
counter1 += 1
такпрактически любая строка, которая начинается с From
, будет увеличивать первый счетчик counter1
, и, следовательно, последующие elif
не проверяются, а их счетчики не увеличиваются.