计算其项目出现次数的字典

时间:2014-01-17 19:42:12

标签: python dictionary counter

我想在python中创建一个dictionary来自动计算其元素的重复次数:

当添加一个未包含的元素时,它应该插入相应的值1,如果再次插入相同的元素,它将增加其计数器。

有没有更优雅/更紧凑的方式来实现这个字典而不是以下内容?

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

4 个答案:

答案 0 :(得分:4)

对于计算元素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})

或列表或其他可迭代:

>>> 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确实是一本字典,那么就不会有任何重复;任何类型只有一个键。


修改

根据你的评论,dict理解很有用(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}

最后一个,只是带有生成器(或lc)的直dict,在这种情况下可能是最“Pythonic”。

答案 1 :(得分:3)

from collections import defaultdict
d = defaultdict(int)
d[var] += 1

答案 2 :(得分: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

答案 3 :(得分: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