Python 字典键计数
在Python2.7中:我正在测量一个计算从函数返回的字典键的进程 下面显示了一个基本示例,其中函数getList()返回字符列表,这些字符可能是['A']、['b']、['c']或['d'];大多数列表都是单个元素,但有时可能返回两个元素,例如,['a','d']。我要清点所有归还的东西。我的想法如下所示:Python 字典键计数,python,dictionary,Python,Dictionary,在Python2.7中:我正在测量一个计算从函数返回的字典键的进程 下面显示了一个基本示例,其中函数getList()返回字符列表,这些字符可能是['A']、['b']、['c']或['d'];大多数列表都是单个元素,但有时可能返回两个元素,例如,['a','d']。我要清点所有归还的东西。我的想法如下所示: myDict = {'a':0, 'b':0, 'c':0, 'd':0, 'error':0, 'total':0} for key in charList:
myDict = {'a':0, 'b':0, 'c':0, 'd':0, 'error':0, 'total':0}
for key in charList:
myDict[key] += 1
myDict['total'] += 1
是否有一种更类似于python的方法,比如字典理解来计算列表中的键(长度不同)?
import random
def getList():
'''mimics a prcoess that returns a list of chars between a - d
[most lists are single elements, though some are two elements]'''
number = (random.randint(97,101))
if number == 101:
charList = [chr(number-1), chr(random.randint(97,100))]
if charList[0] == charList[1]:
getList()
else:
charList = [chr(number)]
return charList
myDict = {'a':0, 'b':0, 'c':0, 'd':0, 'error':0, 'total':0}
for counter in range(0,5):
charList = getList()
for key in charList:
print charList, '\t', key
try:
myDict[key] += 1
myDict['total'] += 1
except:
myDict['error'] += 1
print "\n",myDict
生成的输出:
您可以使用内置的
集合。计数器类:
例如,您的代码:
import collections
ctr = collections.Counter()
for ii in range(0,5):
charList = getList()
ctr.update(charList)
ctr['total'] = sum(ctr.values())
print ctr
这将打印:
Counter({'total': 7, 'd': 5, 'a': 1, 'c': 1})
您可以使用:
注意:如果getList()
返回的list
包含新字符('e'
,'f'
,…),这可能会在不设置'error'
条目的情况下向计数器添加新键
>>> lst = [['a'], ['a', 'b'], ['c'], ['c', 'd']]
>>> c = collections.Counter((y for x in lst for y in x))
>>> c
Counter({'a': 2, 'c': 2, 'b': 1, 'd': 1})
>>> c.most_common(2)
[('a', 2), ('c', 2)]
>>> sum(c.values())
6
我能想到的最简单的方法是用链将列表展平,然后使用计数器:让lst
成为列表[[['a'],['b'],['c'],['d'],['a',d']]
>>> lst = [['a'], ['a', 'b'], ['c'], ['c', 'd']]
>>> c = collections.Counter((y for x in lst for y in x))
>>> c
Counter({'a': 2, 'c': 2, 'b': 1, 'd': 1})
>>> c.most_common(2)
[('a', 2), ('c', 2)]
>>> sum(c.values())
6
>>> from itertools import chain
>>> from collections import Counter
>>> c = Counter(chain(*lst))
>>> c['total'] = sum(c.values())
>>> c
Counter({'total': 6, 'd': 2, 'a': 2, 'b': 1, 'c': 1})