Попытка найти мажоритарный элемент в списке
Я пишу функцию, чтобы найти большинство в списке 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