Python max с тем же количеством экземпляров - PullRequest
8 голосов
/ 01 апреля 2012

У меня есть список:

hello = ['1', '1', '2', '1', '2', '2', '7']

Я хотел отобразить самый распространенный элемент списка, поэтому я использовал:

m = max(set(hello), key=hello.count)

Однако я понял, что могут быть два элемента списка, которые встречаются с одинаковой частотой, как 1 и 2 в списке выше. Макс выводит только первый экземпляр элемента максимальной частоты.

Какая команда может проверить список, чтобы увидеть, есть ли у двух элементов максимальное количество экземпляров, и если да, вывести их оба? Я в недоумении.

Ответы [ 3 ]

13 голосов
/ 01 апреля 2012

Используя подход, аналогичный вашему текущему, вы сначала найдете максимальное количество, а затем ищите каждый элемент с таким количеством:

>>> m = max(map(hello.count, hello))
>>> set(x for x in hello if hello.count(x) == m)
set(['1', '2'])

В качестве альтернативы, вы можете использовать класс Counter, который может использоваться для эффективного, ну, подсчета вещей:

>>> hello = ['1', '1', '2', '1', '2', '2', '7']
>>> from collections import Counter
>>> c = Counter(hello)
>>> c
Counter({'1': 3, '2': 3, '7': 1})
>>> common = c.most_common()
>>> common
[('1', 3), ('2', 3), ('7', 1)]

Затем вы можете использовать понимание списка, чтобы получить все элементы с максимальным количеством:

>>> set(x for x, count in common if count == common[0][1])
set(['1', '2'])
3 голосов
/ 01 апреля 2012

Редактировать: измененное решение

>>> from collections import Counter
>>> from itertools import groupby
>>> hello = ['1', '1', '2', '1', '2', '2', '7']
>>> max_count, max_nums = next(groupby(Counter(hello).most_common(),
                               lambda x: x[1]))
>>> print [num for num, count in max_nums]
['1', '2']
2 голосов
/ 01 апреля 2012
from collections import Counter

def myFunction(myDict):
    myMax = 0 # Keep track of the max frequence
    myResult = [] # A list for return

    for key in myDict:
        print('The key is', key, ', The count is', myDict[key])
        print('My max is:', myMax)
        # Finding out the max frequence
        if myDict[key] >= myMax:
            if myDict[key] == myMax:
                myMax = myDict[key]
                myResult.append(key)
            # Case when it is greater than, we will delete and append
            else:
                myMax = myDict[key]
                del myResult[:]
                myResult.append(key)
    return myResult

foo = ['1', '1', '5', '2', '1', '6', '7', '10', '2', '2']
myCount = Counter(foo)
print(myCount)

print(myFunction(myCount))

Вывод:

The list: ['1', '1', '5', '2', '1', '6', '7', '10', '2', '2']
Counter({'1': 3, '2': 3, '10': 1, '5': 1, '7': 1, '6': 1})
The key is 10 , The count is 1
My max is: 0
The key is 1 , The count is 3
My max is: 1
The key is 2 , The count is 3
My max is: 3
The key is 5 , The count is 1
My max is: 3
The key is 7 , The count is 1
My max is: 3
The key is 6 , The count is 1
My max is: 3
['1', '2']

Я написал эту простую программу, думаю, она также может работать.Я не знал о функции most_common(), пока не выполнил поиск.Я думаю, что это вернет столько же самых частых элементов, сколько нужно, это работает путем сравнения элемента max часто, когда я вижу более частый элемент, он удаляет список результатов и добавляет его один раз;или если это одна и та же частота, она просто добавляется к ней.И продолжайте, пока весь счетчик не будет повторен.

...