2012-06-24 62 views
1

我試圖返回列表中最常見的元素(統計模式)。不幸的是,我不知道如何在迭代器中使用all。這就是如果我不使用全部():如何在列表中找到最常見的元素(使用all())

def large(a): 
for i in set(a): 
    for j in set(a): 
     if a.count(i)<a.count(j): 
      break 
return i 

但是,我知道這可以寫得更雄辯。有人能寫出更有說服力的版本嗎? 我相信它是沿着線的東西:

[i for i,j in set(a) if all(a.count(i)>a.count(j)] 

此代碼有2個問題。首先是set(a)需要第二個值才能解包,第二個是all在這裏不起作用。

請幫我解決。謝謝!

實例:{'a','a','b','b','b','c'}你所期望的「b」是最大的元素

+0

'所有()'是不是一個迭代器,[這是一個內置的。](http://docs.python.org/library/functions.html#all) – Makoto

+0

糟糕你的權利我打算說如何使用所有與迭代 –

+0

我已經鏈接你的文檔頁;那應該會給你一個開頭。 – Makoto

回答

2

確定 - 現在明白你的問題。下面的代碼不是通常應該如何解決這個問題。但學習all()如何工作是可以的。請注意,它的效率遠低於Counter。有趣的是,它會返回最頻繁的每個元素 - 所以在需要精確處理多模式數據時可能會有用。

>>> q = list("aaabbbbcc") 
>>> q 
['a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c'] 
>>> r = set(q) 
>>> r 
set(['a', 'c', 'b']) 
>>> [x for x in r if all([q.count(x) >= q.count(y) for y in r])] 
['b'] 
+0

在你的第一個例子中,當all都是小寫時,'all()'顯示爲true。在if語句下,不可能將'all()'顯示爲true?這基本上是我希望做的......也許我誤解了所有功能 –

+0

這是 - 我已經發布的例子,應該清除它:) –

+1

謝謝!我想要這個答案vs計數器答案的原因是因爲我已經看到了以這種方式使用的'All()',它大大減少了代碼行,我想開始編碼而不是我的多重嵌套'for'循環。再次感謝! –

1
from collections import Counter 

def most_common(a): 
    return Counter(a).most_common(1)[0][0] 

如果你絕對有all做到這一點 - 我不認爲這是最好的方法 - 嘗試

def most_common(a): 
    a_count = [(i, a.count(i)) for i in set(a)] 
    for i,c in a_count: 
     if all(c >= cc for ii,cc in a_count): 
      return i 
+0

謝謝,但我知道櫃檯,我正在學習all()函數,以便我將來可以使用它 –

+0

同時ii和cc是指什麼? (爲什麼你需要兩個我和兩個C? –

+0

@Chowza:我用它作爲「其他我」和「其他C」的短手(因爲我不能使用我和C';-) –

相關問題