2014-01-17 33 views
0

我想創建在Python dictionary自動計數其元素的重複:字典計數其項的出現

補充說明的是不包含的元件時,它應與相應的值1插入它,如果再次插入相同的元素,它將增加其計數器。

是否有更優雅/緊湊的方式來實現這個詞典,而不是以下?

if var in myList: 
    myDictionary[var] += 1 
else: 
    myDictionary[var] = 1 
+1

一個,這不是在答案:'myDictionary [VAR] = myDictionary.get(VAR,0)+ 1'。但真的不要重新發明輪子,使用'collections.Counter'。 – roippi

+0

@roippi - collections.Counter'和'collections.defaultdict'之間的主要區別是什麼? – Matteo

+1

答案不會真正適合評論框,但「計數器」更高效。你可以給它一個生成器表達式或一個迭代器,並且它在內部循環*在C代碼*中進行計數。另一方面,你仍然需要用'defaultdict'寫一個明確的'for'循環(慢,詳細)。當你需要以一種更復雜的方式積累某些東西而不僅僅是計算時,defaultdict仍然很棒。 – roippi

回答

3

計數元素Counter是巨大的。

from collections import Counter 

counted=Counter(iterable) 

您可以使用字典類的物品:

>>> myDict=dict(a=1,b=2,c=3) 
>>> myDict 
{'a': 1, 'c': 3, 'b': 2} 
>>> Counter(myDict) 
Counter({'c': 3, 'b': 2, 'a': 1}) 

或列表或其他iterables:

>>> Counter('aabbccaabcaaa') 
Counter({'a': 7, 'c': 3, 'b': 3}) 

對於澄清,您有:

if var in myDictionary:    # loops over the KEYS of myDictionary 
    myDictionary[var] += 1 
else: 
    myDictionary[var] = 1 

假設myDictionary是確實是一本字典,永遠不會有任何重複;只有一種類型的鑰匙。


編輯

基於您的評論,一個字典的理解是非常有用的(Python 2.7版或3+)

>>> myDict={'a':[1], 'b':[1,2], 'c':[1,2,3]} 
>>> {k:len(v) for k, v in myDict.iteritems()} 
{'a': 1, 'c': 3, 'b': 2} 

隨着defaultdict:

>>> from collections import defaultdict 
>>> dd=defaultdict(int) 
>>> for k, v in myDict.iteritems(): 
... dd[k]=len(v) 
... 
>>> dd 
defaultdict(<type 'int'>, {'a': 1, 'c': 3, 'b': 2}) 

計數器(與列表理解):

>>> Counter([(k,len(v)) for k, v in myDict.iteritems()]) 
Counter({('a', 1): 1, ('b', 2): 1, ('c', 3): 1}) 

或者,只是使用dict構造函數發生器:

>>> dict((k,len(v)) for k, v in myDict.iteritems()) 
{'a': 1, 'c': 3, 'b': 2} 

最後一個,只是直dict與發電機(或LC),恐怕是最「Python化」在這種情況下, 。

+0

我的不好。我沒有提到問題的一部分,我會編輯它...我有一個列表字典,每個列表都有不同的長度,這就是我想要計算的數字(長度有多少個不同的值) 。 – Matteo

+0

我也可以問你什麼時候'collections.Counter'和'collections.defaultdict'之間的區別是什麼時候使用一個或另一個?很多! – Matteo

3
from collections import defaultdict 
d = defaultdict(int) 
d[var] += 1 
1
from collections import defaultdict 
count_dict = defaultdict(int) # creates an int() for missing element, which is 0 

count_dict['foo'] += 1 
print count_dict['foo'] # prints 1 
1

使用collections.Counter

import collections 

c = collections.Counter([1,2,1,1,1,1,2]) 

print c 

c[1] += 1 
c[2] += 2 
c[3] += 1 

print c