Решён
Не считает количество совпадений в функции FOR - Python

Денис Воганов Python
2.4k
5

Пишу скрипт на Python, задача простая: пройтись по списку строк и посчитать сколько раз встречается определенное слово. Использую цикл for, но счетчик всегда возвращает 0 или неправильное значение.

Вот код:

words = ["apple", "banana", "apple", "cherry", "apple"]
count = 0

for word in words:
    if word == "Apple":
        count += 1

print(count)

Ожидаю 3, получаю 0. Что не так? Python 3.11, Windows 10.

UPDATE: Спасибо всем, проблема была в регистре. Добавил .lower() и все заработало. Как я сам не заметил...
Решение
34
Участник • 4 ответа

Регистр. У тебя в списке "apple" с маленькой буквы, а в условии "Apple" с большой. Python чувствителен к регистру.

Замени на:

if word == "apple":

Или если хочешь искать без учета регистра:

if word.lower() == "apple":
Аватар Денис Воганов

Боже мой. Час сидел, а дело было в одной букве. Спасибо огромное!

52
Участник • 2 ответа

Кроме фикса регистра, имей в виду что для подсчета элементов в списке вообще не нужен цикл for. В Python есть встроенный метод .count():

words = ["apple", "banana", "apple", "cherry", "apple"]
print(words.count("apple"))  # 3

А если нужно посчитать все уникальные элементы сразу, бери collections.Counter:

from collections import Counter
words = ["apple", "banana", "apple", "cherry", "apple"]
print(Counter(words))
# Counter({'apple': 3, 'banana': 1, 'cherry': 1})

Велосипед с ручным счетчиком в цикле - антипаттерн для Python. Язык специально проектировался так, чтобы подобные задачи решались одной строкой.

0
Эксперт • 5 ответов

Ну а гуглить "python string comparison case sensitive" не пробовал перед тем как на форум писать?...

Это буквально первый результат в поиске. Первый.

15
Эксперт • 5 ответов

Дополню ответ выше про Counter. Если данные большие и приходят из файла или API, есть смысл не грузить весь список в память, а считать на лету через генератор:

count = sum(1 for word in words if word.lower() == "apple")

На маленьких списках разницы нет, но на миллионах строк ощутимо экономит память. Хотя для вашего случая это конечно оверкилл, просто на будущее.

7
Участник • 3 ответа

такая же фигня была когда учился, только у меня вместо регистра были лишние пробелы в строках из csv файла. strip() спас) так что если вдруг count все равно не работает после фикса регистра, попробуй word.strip().lower()

Написать ответ

Премодерация гостей

Вы отвечаете как гость. Ваш ответ будет скрыт до проверки модератором. Чтобы ответ появился сразу и вы получали репутацию — войдите в аккаунт.

Будьте вежливы и соблюдайте правила платформы.