Учитывая один элемент, как мне подсчитать его вхождения в списке в Python?
Связанная, но другая проблема заключается в подсчете вхождений каждого отдельного элемента в коллекции, получении словаря или списка в виде гистограммы вместо одного целого числа. Об этой проблеме см. в разделе Использование словаря для подсчета элементов в списке.
Переведено автоматически
Ответ 1
Если вам нужно количество только одного элемента, используйте count метод:
>>> [1, 2, 3, 4, 1, 4, 1].count(1) 3
Важно: это происходит очень медленно, если вы подсчитываете несколько разных элементов
Каждый count вызов проходит по всему списку n элементов. Вызов count в цикле n раз означает n * n тотальные проверки, что может иметь катастрофические последствия для производительности.
Если вы хотите подсчитать несколько элементов, используйте Counter, который выполняет только n тотальные проверки.
Ответ 2
Используйте Counter, если вы используете Python 2.7 или 3.x и вам нужно количество вхождений для каждого элемента:
Для подсчета вхождений только одного элемента списка вы можете использовать count()
>>> l = ["a","b","b"] >>> l.count("a") 1 >>> l.count("b") 2
Подсчет вхождений всех элементов в списке также известен как "подсчет" списка или создание счетчика подсчета.
Подсчет всех элементов с помощью count ()
Для подсчета вхождений элементов в l можно просто использовать представление списка и count() метод
[[x,l.count(x)] for x inset(l)]
(или аналогично со словарем dict((x,l.count(x)) for x in set(l)))
Пример:
>>> l = ["a","b","b"] >>> [[x,l.count(x)] for x inset(l)] [['a', 1], ['b', 2]] >>> dict((x,l.count(x)) for x inset(l)) {'a': 1, 'b': 2}
Подсчет всех элементов с помощью Counter ()
В качестве альтернативы есть более быстрый Counter класс из collections библиотеки
Counter(l)
Пример:
>>> l = ["a","b","b"] >>> from collections import Counter >>> Counter(l) Counter({'b': 2, 'a': 1})
Насколько быстрее работает Counter?
Я проверил, насколько быстрее Counter выполняется подсчет списков. Я опробовал оба метода с несколькими значениями n и оказалось, что Counter быстрее примерно в 2 раза.
Вот скрипт, который я использовал:
from __future__ import print_function import timeit
t1=timeit.Timer('Counter(l)', \ 'import random;import string;from collections import Counter;n=1000;l=[random.choice(string.ascii_letters) for x in range(n)]' )
t2=timeit.Timer('[[x,l.count(x)] for x in set(l)]', 'import random;import string;n=1000;l=[random.choice(string.ascii_letters) for x in range(n)]' )