2012-11-24 113 views
2

我明白如何在列表中找到最常見的元素?

a = max(set(lst), key=lst.count) 

將顯示在列表

獲得最常見的元素,但你怎麼推導的目錄列表最常見的元素,而無需使用輔助函數?

例如

lst = [['1','2','3','4'],['1','1','1','1'],['1','2','3','4']] 

輸出應等於1

當我嘗試a = max(set(lst), key=lst.count)

寫入builtins.TypeError: unhashable type: 'list'

任何人都可以幫我嗎?

+0

這將是你的預期輸出:''[[1 '','2','3','4'],['1','1','2','2'],['2','2','3','4'] ]'? –

+0

你是什麼意思的「幫手功能」?你的定義似乎包括'Counter',但不包括'max'和'set'。你應該比使用標準庫更好地考慮避免O(N^2)行爲(就像你的'max(set(lst),key = list.count)')。 –

回答

3

有很多方法,但我想讓你知道在標準模塊中有一些很好的工具可用於這類事情。 collections.Counter

In [1]: lst = [['1','2','3','4'],['1','1','1','1'],['1','2','3','4']] 
In [2]: from collections import Counter 
In [3]: from operator import itemgetter 
In [4]: max((Counter(l).most_common(1)[0] for l in lst), key=itemgetter(1))[0] 
Out[4]: '1' 

或者,你可以(有點)採用當前解決方案對每個子表:

In [5]: max(((max(set(l), key=l.count), l) for l in lst), 
    ...: key=lambda x: x[1].count(x[0]))[0] 
Out[5]: '1' 
+0

我真的很感謝你的代碼,但是你有沒有其他的功能不需要itemgetter和counter?所以我的意思是簡單的Python編程,它不需要任何語句或者導入語句 –

+2

好的Python代碼利用了現有的優秀模塊。是否有任何理由想要避免內置模塊?這是功課嗎? –

+0

不,我會說它是一個功能的一部分,以縮短一個函數,而不使用太多的if語句,它是一個Python課程的介紹。 –

2

只是彙整list of list,並在其上使用collections.Counter。然後用Counter.most_common()方法與他們發生從最高到最低的數量來獲得元素tuplelist: -

>>> lst = [['1','2','3','4'],['1','1','1','1'],['1','2','3','4']] 
>>> flattened_list = [elem for sublist in lst for elem in sublist] 
>>> flattened_list 
['1', '2', '3', '4', '1', '1', '1', '1', '1', '2', '3', '4'] 
>>> 
>>> from collections import Counter 
>>> 
>>> counter = Counter(flattened_list) 
>>> counter.most_common() 
[('1', 6), ('3', 2), ('2', 2), ('4', 2)] 
>>> 
>>> counter.most_common(1) 
('1', 6) 

或者,你可以用你的方法從flatten列表獲得最常見的元素。

>>> max(set(flattened_list), key=flattened_list.count) 
'1' 

您也可以扁平化您的列表如下: -

>>> sum(lst, []) 
['1', '2', '3', '4', '1', '1', '1', '1', '1', '2', '3', '4'] 

所以,作爲一個班輪,你可以做這樣的: -

>>> lst = [['1','2','3','4'],['1','1','1','1'],['1','2','3','4']] 

>>> max(set(sum(lst, [])), key=sum(lst, []).count) 
'1' 

當然,最後一個創建兩個具有相同內容的列表。

+0

'most_common'將項目數量作爲參數。 –

+0

@LevLevitsky ..是啊編輯。謝謝:) –

1

您必須將您的列表弄平(使用chain(*lst)),然後用Counter(chain(*lst).most_common())對列表中每個元素的輸入進行計數並對結果進行排序。

from itertools import chain 
from collections import Counter 

lst = [['1','2','3','4'],['1','1','1','1'],['1','2','3','4']] 
sorted(Counter(chain(*lst)).most_common())[0][0] 
+1

嘗試提供評論或解釋。謝謝。 –

0

你可以使用Counter找到最常見的元素,並chain通過列表清單中的元素進行迭代:

from collections import Counter 
from itertools import chain 

print Counter(val for val in chain.from_iterable(lst)).most_common(1) 
相關問題