Python: значение, которое встречается чаще всего в списке
у меня есть два списка следующим образом
x = ['a','a','b','c','b','a']
и
x = ['a','a','b','c','c','d']
Я пытаюсь найти значения, которые происходят в каждом из этих списков. Это то, что я пробовал.
def unique_values(output,input):
for i in input:
if i not in output:
output.append(i)
k = []
for i in k:
unique_values(k,x)
y.remove(i)
Я получил это далеко но я не могу понять, как остановить for i in k:
прежде чем он удалит все значения в списке.
2 ответов
можно использовать 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']
вот еще одно решение:
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')]