我想在python中创建一个dictionary
来自动计算其元素的重复次数:
当添加一个未包含的元素时,它应该插入相应的值1
,如果再次插入相同的元素,它将增加其计数器。
有没有更优雅/更紧凑的方式来实现这个字典而不是以下内容?
if var in myList:
myDictionary[var] += 1
else:
myDictionary[var] = 1
答案 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