Python 试图在列表中查找多数元素

Python 试图在列表中查找多数元素,python,arrays,hash,hashcode,Python,Arrays,Hash,Hashcode,我正在编写一个函数来查找Python列表中的多数 如果我可以编写一个哈希函数,将每个元素映射到新数组中的一个插槽或唯一标识符,也许对于字典来说,这应该是最好的,而且应该是可撤销的。我不知道如何进步。我的散列函数显然是无用的,关于我可以/应该做什么,或者这是否是一种合理的方法,有什么建议吗 def find_majority(k): def hash_it(q): return q map_of = [0]*len(k) for i in k:

我正在编写一个函数来查找Python列表中的多数

如果我可以编写一个哈希函数,将每个元素映射到新数组中的一个插槽或唯一标识符,也许对于字典来说,这应该是最好的,而且应该是可撤销的。我不知道如何进步。我的散列函数显然是无用的,关于我可以/应该做什么,或者这是否是一种合理的方法,有什么建议吗

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])

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
见文件


我认为您的方法是使用另一个像
k
一样大的数组作为“哈希映射”。如果
k
很大,但唯一元素的数量没有那么多,则会浪费大量空间。此外,要找到大多数,您必须循环使用hashmap/array的
map\u来找到最大值

另一方面,字典/集合(这里不需要考虑散列,对于一般情况,底层数组结构可能更紧凑)似乎更合适一些。不用说,将出现的元素作为键,将它们的出现作为值,您可以在一次迭代中找到所需的内容

比如说:

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)

当然,计数器和其他很酷的模块可以让你用更精细的语法做你想做的事情。

有一种简单的方法来实现这一点

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

在Python中,您可能想使用字典而不是手动滚动的哈希函数——这种语言非常不鼓励您这样做。您想查找最常见的元素还是主要元素(多于N/2次)?使用
c.most_common(1)[0]
--
max()
vs.
sort())
。除了你还需要自己检查领带。是的!事实上,我只是用一本字典以一种非常相似的方式解决了它!