2013-07-19 55 views
1

我一直在使用max(Counter(a_list_here),key=Counter(a_list_here).get)來獲得最常見的元素。得到最常見的元素,但如果頻率匹配,得到更低的元素

但是,當有2個元素具有匹配的頻率時,我想獲得最小的元素。例如:

a= [1,2,5,5,8,8,5,7,8]

有三個5和三個787-8。我的功能max(Counter(a),key=Counter(a).get)產生8而不是5.

有沒有辦法快速乾淨地做到這一點?

我使用python 3.2

回答

1

試試這個,就沒有必要先解決它:

from collections import Counter 
a = [1,2,5,5,8,8,5,7,8] 

在Python 2.7:

max(Counter(a).iteritems(), key=lambda (k,v): (v,-k))[0] 
=> 5 

在Python 3.X:

max(Counter(a).items(), key=lambda p: (p[1],-p[0]))[0] 
=> 5 
+0

什麼是這個時間複雜度?非常聰明的工作在 –

+0

這是'O(n)'複雜 –

+0

太棒了!不過,我在'(k,v)'的括號中得到了一個語法錯誤......是python 3的區別嗎? –

1

這可能不是最快的方法,但是:

sorted([x for x in a if a.count(x) > 1])[0] 

>>> a= [1,2,5,5,8,8,5,7,8] 
>>> sorted([x for x in a if a.count(x) > 1])[0] 
5 
+0

是爲O(n^2) –

+0

的n log N - n到列表中去,則n日誌N排序 – Owen