我想創建在Python dictionary
自動計數其元素的重複:字典計數其項的出現
補充說明的是不包含的元件時,它應與相應的值1
插入它,如果再次插入相同的元素,它將增加其計數器。
是否有更優雅/緊湊的方式來實現這個詞典,而不是以下?
if var in myList:
myDictionary[var] += 1
else:
myDictionary[var] = 1
我想創建在Python dictionary
自動計數其元素的重複:字典計數其項的出現
補充說明的是不包含的元件時,它應與相應的值1
插入它,如果再次插入相同的元素,它將增加其計數器。
是否有更優雅/緊湊的方式來實現這個詞典,而不是以下?
if var in myList:
myDictionary[var] += 1
else:
myDictionary[var] = 1
計數元素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化」在這種情況下, 。
from collections import defaultdict
d = defaultdict(int)
d[var] += 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
使用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
一個,這不是在答案:'myDictionary [VAR] = myDictionary.get(VAR,0)+ 1'。但真的不要重新發明輪子,使用'collections.Counter'。 – roippi
@roippi - collections.Counter'和'collections.defaultdict'之間的主要區別是什麼? – Matteo
答案不會真正適合評論框,但「計數器」更高效。你可以給它一個生成器表達式或一個迭代器,並且它在內部循環*在C代碼*中進行計數。另一方面,你仍然需要用'defaultdict'寫一個明確的'for'循環(慢,詳細)。當你需要以一種更復雜的方式積累某些東西而不僅僅是計算時,defaultdict仍然很棒。 – roippi