항목

2009-06-28 5 views
8

확인 사전 파이썬 목록에서 주파수, 그래서 나는 dicts의 목록이 있습니다항목

[{'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) 

원하는 (물론 따로 키 위해, - 그것은 DICT에서 무관의)와 같은

{'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

이것은?

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

+0

collections.defaultdict가 구현하는 "if_hands_key"논리를 복제하는 것이 더 간단합니까? 이것은 1.5.2에서했던 것입니다 (2.0에서 global_dict의 key가 아니라면 더 간단하고 빠른 관용구를 추가하기 전에). 그러나 "구식 버전과 호환"은 "simple"과 동일하지 않습니다 ;-). –

+0

초보자를위한 가장 간단한 :) – zinovii

2

새로운 파이썬 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}}