2015-12-15 6 views
1

В Python 2.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 

Есть более Pythonic путь, возможно, словарь понимание сосчитать ключей в списках (разной длины)?

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 

Выход генерироваться:

Output

ответ

1

Вы можете использовать встроенный в collections.Counter классе: https://docs.python.org/2/library/collections.html#collections.Counter

Например с вашим кодом:

import collections 
ctr = collections.Counter() 

for ii in range(0,5): 
    charList = getList() 
    ctr.update(charList) 

ctr['total'] = sum(ctr.values()) 
print ctr 

Это будет пр INT:

Counter({'total': 7, 'd': 5, 'a': 1, 'c': 1}) 
1

Вы можете использовать collections.Counter:

# You need to initialize the counter or you won't get the entry with 0 count. 
myDict = collections.Counter({'a': 0, 'b': 0, 'c': 0, 'd': 0}) 
myDict.update(x for _ in range(0, 5) for x in getList()) 
# Then create the 'total' entry 
myDict['total'] = sum(myDict.values()) 

Примечания: Это может добавить новые ключи к прилавку без установки 'error' записи, если list возвращаемого getList() содержит новые символы ('e', 'f' , ...).

0

Использование collections.Counter и выражение генератор двойной контур для подачи отдельных элементов в счетчике:

>>> 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 
0

Самый простой способ, которым я могу думать о том, чтобы сгладить свой список с chain, а затем использовать Counter: до lst be list [['a'], ['b'], ['c'], ['d'], ['a', 'd']]

>>> 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}) 
Смежные вопросы