Попытка найти мажоритарный элемент в списке

Я пишу функцию, чтобы найти большинство в списке Python.

думая, что если я могу написать хэш-функцию, которая может сопоставить каждый элемент с одним слотом в новом массиве или с уникальным идентификатором, возможно, для словаря, это должно быть лучшим, и оно должно быть undoable. Я не уверен, как этого достичь. Моя хэш-функция, очевидно, бесполезна, любые советы о том, что я могу/должен делать, или если это даже разумный подход?

def find_majority(k):
    def hash_it(q):
        return q

    map_of = [0]*len(k)

    for i in k:
        mapped_to = hash_it(i) #hash function
        map_of[mapped_to]+=1


find_majority([1,2,3,4,3,3,2,4,5,6,1,2,3,4,5,1,2,3,4,6,5])

3 ответов


Я думаю, что ваш подход заключается в использовании другого массива размером k Как ваша "хэш-карта". Если k огромно, но количество уникальных элементов не так огромно, вы бы тратить много места. Кроме того, чтобы найти большинство, вам придется пройти через свой map_of HashMap / array для поиска макс.

С другой стороны, словарь/набор (где хэширование не ваша забота, и базовая структура массива, вероятно, будет более компактной для средних случаев) кажется немного более приемлемым. Излишне говорить, что с возникающими элементами в качестве ключей и их вхождениями в качестве значений вы можете найти то, что хотите, за одну итерацию.

так, что-то вроде:

def find_majority(k):
    myMap = {}
    maximum = ( '', 0 ) # (occurring element, occurrences)
    for n in k:
        if n in myMap: myMap[n] += 1
        else: myMap[n] = 1

        # Keep track of maximum on the go
        if myMap[n] > maximum[1]: maximum = (n,myMap[n])

    return maximum

и, как и ожидалось, мы получаем то, что хотим.

>>> find_majority([1,2,3,4,3,3,2,4,5,6,1,2,3,4,5,1,2,3,4,6,5])
(3, 5)

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


Python имеет встроенный класс под названием Counter это сделает это за вас.

>>> from collections import Counter
>>> c = Counter([1,2,3,4,3,3,2,4,5,6,1,2,3,4,5,1,2,3,4,6,5])
>>> c.most_common()
[(3, 5), (2, 4), (4, 4), (1, 3), (5, 3), (6, 2)]
>>> value, count = c.most_common()[0]
>>> print value
3

посмотреть документы.

http://docs.python.org/2/library/collections.html#collections.Counter


существует простой способ реализовать это

l = [1,2,3,4,3,3,2,4,5,6,1,2,3,4,5,1,2,3,4,6,5]
print(max(set(l), key = l.count)) # 3