Учитывая элемент, как я могу подсчитать его вхождения в списке в Python?
1530
Если вам нужен только один элемент, используйте count
метод:
>>> [1, 2, 3, 4, 1, 4, 1].count(1)
3
Не используйте это, если вы хотите сосчитать несколько предметов. Вызов count
в цикле требует отдельного прохода по списку для каждого count
вызова, что может иметь катастрофические последствия для производительности. Если вы хотите сосчитать все элементы или даже просто несколько элементов, используйте Counter
, как описано в других ответах.
mylist = [1,7,7,7,3,9,9,9,7,9,10,0] print sorted(set([i for i in mylist if mylist.count(i)>2]))
Используйте,
Counter
если вы используете Python 2.7 или 3.x, и вы хотите количество вхождений для каждого элемента:источник
isinstance
. Поэтому, если вы уверены в данных, с которыми работаете, может быть лучше написать пользовательскую функцию без проверки типа и экземпляра.isinstance
звонит? Даже с миллионами строк вызовCounter
требует только одногоisinstance
вызова, чтобы проверить, является ли его аргумент отображением. Скорее всего, вы неправильно оценили, что кушает все время.Counter
были направлены на подсчет больших итераций, а не на количество итераций. Подсчет итерируемой миллионной строки будет проходить быстрее,Counter
чем при ручной реализации. Если вы хотите вызыватьupdate
много итераций, вы можете ускорить процесс, соединив их в одну итерацию сitertools.chain
.Подсчет вхождений одного элемента в списке
Для подсчета вхождений только одного элемента списка вы можете использовать
count()
Подсчет вхождений всех элементов в списке также называется «подсчетом» списка или созданием счетчика.
Подсчет всех предметов с помощью count ()
Для подсчета вхождений предметов в
l
один можно просто использовать понимание списка иcount()
метод(или аналогично со словарем
dict((x,l.count(x)) for x in set(l))
)Пример:
Подсчет всех предметов с помощью счетчика ()
Кроме того, есть более быстрый
Counter
класс изcollections
библиотекиПример:
Насколько быстрее счетчик?
Я проверил, насколько быстрее
Counter
для подсчета списков. Я опробовал оба метода с несколькими значениями,n
и оказалось, чтоCounter
быстрее с постоянным коэффициентом примерно 2.Вот скрипт, который я использовал:
И вывод:
источник
Counter
это намного быстрее для больших списков. Метод понимания списка O (n ^ 2),Counter
должен быть O (n).isinstance
. Поэтому, если вы уверены в данных, с которыми работаете, может быть лучше написать пользовательскую функцию без проверки типа и экземпляра.Другой способ получить количество вхождений каждого элемента в словаре:
источник
n * (number of different items)
операции, не считая время, необходимое для создания набора. Использованиеcollections.Counter
действительно намного лучше.i
, потому что он попытается ввести несколько ключей одинакового значения в словаре.dict((i, a.count(i)) for i in a)
list.count(x)
возвращает количество разx
появляется в спискевидеть: http://docs.python.org/tutorial/datastructures.html#more-on-lists
источник
Вот список примеров:
list.count
Есть
list.count
методЭто прекрасно работает для любого списка. У кортежей также есть этот метод:
collections.Counter
А потом есть коллекции. Счетчик. Вы можете сбросить любую итерацию в счетчик, а не просто в список, и счетчик сохранит структуру данных счетчиков элементов.
Применение:
Счетчики основаны на словарях Python, их ключи являются элементами, поэтому ключи должны быть хэшируемыми. Они в основном похожи на наборы, которые допускают избыточные элементы в них.
Дальнейшее использование
collections.Counter
Вы можете добавить или вычесть с помощью итераций из вашего счетчика:
И вы можете выполнять множественные операции со счетчиком:
Почему не панды?
Другой ответ предполагает:
Панды - это обычная библиотека, но ее нет в стандартной библиотеке. Добавление его в качестве требования нетривиально.
Для этого варианта использования есть встроенные решения как в самом объекте списка, так и в стандартной библиотеке.
Если ваш проект еще не требует панды, было бы глупо сделать это требованием только для этой функциональности.
источник
Я сравнил все предложенные решения (и несколько новых) с perfplot ( мой небольшой проект).
Считая один предмета
Для достаточно больших массивов получается, что
немного быстрее, чем другие решения.
Считать все предметов
Как установлено ранее ,
это то, что вы хотите.
Код для воспроизведения сюжетов:
2.
источник
Если вы хотите посчитать все значения одновременно, вы можете сделать это очень быстро, используя числовые массивы и
bincount
следующим образомкоторый дает
источник
Если вы можете использовать
pandas
, тоvalue_counts
есть для спасения.Он также автоматически сортирует результат по частоте.
Если вы хотите, чтобы результат был в списке, выполните следующие действия.
источник
Почему бы не использовать панд?
Вывод:
Если вы ищете отсчет определенного элемента, скажем , попробуйте:
Вывод:
источник
У меня была эта проблема сегодня, и я нашел собственное решение, прежде чем я решил проверить SO. Эта:
действительно очень медленно для больших списков. Мое решение
на самом деле немного быстрее, чем решение Counter, по крайней мере для Python 2.7.
источник
источник
Ниже приведены три решения:
Самый быстрый использует цикл for и хранит его в Dict.
Результат
источник
Подсчет всех элементов с
itertools.groupby()
Другая возможность получить количество всех элементов в списке может быть с помощью
itertools.groupby()
.С «дубликатами»
Возвращает
Обратите внимание, как он объединил первые три
a
в качестве первой группы, в то время как другие группыa
присутствуют ниже по списку. Это происходит потому, что список вводаL
не был отсортирован. Иногда это может быть полезным, если группы фактически должны быть отдельными.С уникальным количеством
Если требуется уникальное количество групп, просто отсортируйте входной список:
Возвращает
Примечание. Для создания уникальных подсчетов многие другие ответы предоставляют более простой и читаемый код по сравнению с
groupby
решением. Но здесь показано, чтобы провести параллель с примером дублирования счета.источник
Было предложено использовать bincount numpy , однако он работает только для 1d массивов с неотрицательными целыми числами . Кроме того, результирующий массив может сбивать с толку (он содержит вхождения целых чисел от минимального до максимального в исходном списке и устанавливает 0 отсутствующих целых чисел).
Лучший способ сделать это с помощью numpy - использовать уникальную функцию с атрибутом
return_counts
True. Он возвращает кортеж с массивом уникальных значений и массивом экземпляров каждого уникального значения.и тогда мы можем соединить их как
Он также работает с другими типами данных и «2d списками», например
источник
Для подсчета количества различных элементов, имеющих общий тип:
дает
3
не 6источник
Хотя это очень старый вопрос, но так как я не нашел один лайнер, я сделал один.
источник
Вы также можете использовать
countOf
метод встроенного модуляoperator
.источник
countOf
это реализовано? Как это соотносится с более очевиднымlist.count
(что выгодно от реализации C)? Есть ли преимущества?Может быть не самым эффективным, требуется дополнительный проход для удаления дубликатов.
Функциональная реализация:
возвращает:
или вернуть как
dict
:возвращает:
источник
Это вернет количество вхождений your_value
источник
Я бы использовал
filter()
, возьмите пример Лукаша:источник
если вы хотите количество вхождений для конкретного элемента:
источник
источник
это будет рекурсивный подсчет или поиск элемента в списке, даже если он в списке списков
источник