Python: значение, которое больше всего встречается в списке
У меня есть два списка:
x = ['a','a','b','c','b','a']
и
x = ['a','a','b','c','c','d']
Благодаря Rohit я обнаружил, что это работает для второго значения x.
from collections import Counter
count = counter(x)
count.most_common()
Я добавил
mc = [i for i,z in count.most_common() if z == 3]
но мне все равно нужно ввести z == 3
, чтобы получить наиболее частое.
Есть ли способ сделать z == 3
чем-то вроде max(z)
Ответы
Ответ 1
Вы можете использовать модуль Counter
от collections
, если вы хотите найти вхождения каждого элемента в списке: -
>>> x = ['a','a','b','c','c','d']
>>> from collections import Counter
>>> count = Counter(x)
>>> count
Counter({'a': 2, 'c': 2, 'b': 1, 'd': 1})
>>> count.most_common()
[('a', 2), ('c', 2), ('b', 1), ('d', 1)]
Итак, первые два элемента наиболее часто встречаются в вашем списке.
>>> count.most_common()[0]
('a', 2)
>>> count.most_common()[1]
('c', 2)
или вы также передаете параметр most_common()
, чтобы указать, сколько элементов most-common
вы хотите: -
>>> count.most_common(2)
[('a', 2), ('c', 2)]
Обновление: -
Вы также можете сначала узнать число max
, а затем найти общее количество элементов с этим значением, а затем вы можете использовать его как параметр в most_common()
: -
>>> freq_list = count.values()
>>> freq_list
[2, 2, 1, 1]
>>> max_cnt = max(freq_list)
>>> total = freq_list.count(max_cnt)
>>> most_common = count.most_common(total)
[('a', 2), ('c', 2)]
>>> [elem[0] for elem in most_common]
['a', 'c']
Ответ 2
Вот еще одно решение:
max(zip((x.count(item) for item in set(x)), set(x)))
Сначала мы получаем коллекцию, не содержащую повторяющихся элементов с помощью set.
>>> set(x)
{'a', 'c', 'b'}
Затем мы подсчитываем, сколько раз каждый элемент находится в x. Это вернет объект-генератор, вы можете сделать его списком, чтобы увидеть его значения (используя "[...]" вместо "(...)" ), он вернет [3, 1, 2].
>>> (x.count(item) for item in set(x))
Затем мы берем счетчики и соединяем их с элементами, использующими zip. Количество вхождений сначала, для следующего шага. Вы можете увидеть его значение, используя список (...) на нем, он вернет [(3, 'a'), (1, 'c'), (2, 'b')].
>>> zip((x.count(item) for item in set(x)), set(x))
Наконец, мы найдем, какая из пар встречается чаще всего с использованием max.
>>> max(zip((x.count(item) for item in set(x)), set(x)))
(3, 'a')
Что касается второго значения, решение немного длиннее. Вышеупомянутое используется в понимании списка:
>>> [mitem for mitem in zip((x.count(item) for item in set(x)),set(x)) if mitem[0] == max((x.count(item) for item in set(x)))]
[(2, 'a'), (2, 'c')]