2009-06-28 130 views
8

確定的Python列表,所以我有類型的字典列表:項頻率詞典

[{'name': 'johnny', 'surname': 'smith', 'age': 53}, 
{'name': 'johnny', 'surname': 'ryan', 'age': 13}, 
{'name': 'jakob', 'surname': 'smith', 'age': 27}, 
{'name': 'aaron', 'surname': 'specter', 'age': 22}, 
{'name': 'max', 'surname': 'headroom', 'age': 108}, 
] 

,我想在每列中的項目的「頻率」。所以,爲了這個,我會得到這樣的:

{'name': {'johnny': 2, 'jakob': 1, 'aaron': 1, 'max': 1}, 
'surname': {'smith': 2, 'ryan': 1, 'specter': 1, 'headroom': 1}, 
'age': {53:1, 13:1, 27: 1. 22:1, 108:1}} 

任何模塊,在那裏,可以做這樣的東西?

回答

13

collections.defaultdict從標準庫來救援:

from collections import defaultdict 

LofD = [{'name': 'johnny', 'surname': 'smith', 'age': 53}, 
{'name': 'johnny', 'surname': 'ryan', 'age': 13}, 
{'name': 'jakob', 'surname': 'smith', 'age': 27}, 
{'name': 'aaron', 'surname': 'specter', 'age': 22}, 
{'name': 'max', 'surname': 'headroom', 'age': 108}, 
] 

def counters(): 
    return defaultdict(int) 

def freqs(LofD): 
    r = defaultdict(counters) 
    for d in LofD: 
    for k, v in d.items(): 
     r[k][v] += 1 
    return dict((k, dict(v)) for k, v in r.items()) 

print freqs(LofD) 

發射

{'age': {27: 1, 108: 1, 53: 1, 22: 1, 13: 1}, 'surname': {'headroom': 1, 'smith': 2, 'specter': 1, 'ryan': 1}, 'name': {'jakob': 1, 'max': 1, 'aaron': 1, 'johnny': 2}} 

根據需要(爲了鍵隔開,當然 - 它是不相關的在一個字典)。

1

This?

from collections import defaultdict 
fq = { 'name': defaultdict(int), 'surname': defaultdict(int), 'age': defaultdict(int) } 
for row in listOfDicts: 
    for field in fq: 
     fq[field][row[field]] += 1 
print fq 
2
items = [{'name': 'johnny', 'surname': 'smith', 'age': 53}, {'name': 'johnny', 'surname': 'ryan', 'age': 13}, {'name': 'jakob', 'surname': 'smith', 'age': 27}, {'name': 'aaron', 'surname': 'specter', 'age': 22}, {'name': 'max', 'surname': 'headroom', 'age': 108}] 

global_dict = {} 

for item in items: 
    for key, value in item.items(): 
     if not global_dict.has_key(key): 
      global_dict[key] = {} 

     if not global_dict[key].has_key(value): 
      global_dict[key][value] = 0 

     global_dict[key][value] += 1 

print global_dict 

簡單的解決方案和實際測試。

+0

這可能是我怎麼會一直做最終它,從來沒有聽說過collections.defaultdict的。 – dochead 2009-06-28 20:34:00

2

新的Python 3.1的collections.Counter類:

mydict=[{'name': 'johnny', 'surname': 'smith', 'age': 53}, 
{'name': 'johnny', 'surname': 'ryan', 'age': 13}, 
{'name': 'jakob', 'surname': 'smith', 'age': 27}, 
{'name': 'aaron', 'surname': 'specter', 'age': 22}, 
{'name': 'max', 'surname': 'headroom', 'age': 108}, 
] 

import collections 
newdict = {} 

for key in mydict[0].keys(): 
    l = [value[key] for value in mydict] 
    newdict[key] = dict(collections.Counter(l)) 

print(newdict) 

輸出:

{'age': {27: 1, 108: 1, 53: 1, 22: 1, 13: 1}, 
'surname': {'headroom': 1, 'smith': 2, 'specter': 1, 'ryan': 1}, 
'name': {'jakob': 1, 'max': 1, 'aaron': 1, 'johnny': 2}}