Python 字典键计数

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:

在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[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})