2012-06-14 5 views
1

두 개의 사전 (텍스트 파일!)을 병합 할 수있는 프로그램을 작성하려고합니다. 이 사전은 명사와 동사로 구성되며 다른 프로그램에서 다른 코퍼스로 색인을 생성 한 다음 텍스트 파일에 넣습니다. 다음 사전 형식입니다.파이썬 : 목록의 목록을 값으로 집계하고 계산하기

dict1 = {'strawberry': [['eat', 1]], 'family-member': [['look up', 1]], 'mall': [['search', 1]]} 
dict2 = {'strawberry': [['eat', 1]], 'family-member': [['lose', 1]], 'ovation': [['receive', 1]], 'mall': [['build', 1]]} 

볼 수 있듯이 키는 값 목록을 포함하는 사전입니다.

finaldict = {'strawberry': [['eat', 2]], 'family-member': [['look up', 1]['lose',1]], 'mall': [['search', 1]['build', 1]], 'ovation': [['receive', 1]] 

는 지금까지, 나는이 같은 dict1과 dict2을 병합 할 수 있었다 (문자열) :

{'strawberry': [['eat', 1]], 'family-member': [['look up', 1]], 'mall': [['search', 
1]], 'strawberry': [['eat', 1]], 'family-member': [['lose', 1]], 'ovation': 
[['receive', 1]], 'mall': [['build', 1]]} 

나는이 변환 지금이 같은 출력을 얻으려고 다음 문장을 가진 사전으로 문자열 : finaldict = eval (str1) 그것은 사전으로 모든 것을 켭니다, 그것은 또한 내가 finaldict의 유형을 물어볼 때 그렇게 말합니다. 그러나 [[[ 'eat', 1]]을 값이나 다른 것으로 사용합니다. 모든 항목을 반복 할 수 있고 어떤 동사와 함께 표시되는지를 세어 볼 수 있도록이 항목이 필요합니다.

답변

1
from collections import Counter 

dict1 = {'strawberry': [['eat', 1]], 'family-member': [['look up', 1]], 'mall': [['search', 1]]} 
dict2 = {'strawberry': [['eat', 1]], 'family-member': [['lose', 1]], 'ovation': [['receive', 1]], 'mall': [['build', 1]]} 
result = {k: Counter(dict(v)) for k, v in dict1.items()} 
for k, v in dict2.items(): 
    result.setdefault(k, Counter()).update(dict(v)) 

result = {k: [list(x) for x in v.items()] for k, v in result.items()} 
+0

이 용도의 Python의 최소 버전은 무엇입니까? –

+0

2.7 또는 3.1+, dict 내포물이 2.7/3.0에 추가되었으며'collections.Counter'가 2.7/3.1에 추가되었습니다. –

0

너무 멋지다.

from collections import defaultdict 

dict1 = {'strawberry': [['eat', 1]], 'family-member': [['look up', 1]], 'mall': [['search', 1]]} 
dict2 = {'strawberry': [['eat', 1]], 'family-member': [['lose', 1]], 'ovation': [['receive', 1]], 'mall': [['build', 1]]} 
keys = set(dict2.keys()).union(dict1.keys()) 

final = {} 
for k in keys: 
    d1val = dict1.get(k, []) 
    d2val = dict2.get(k, []) 

    resd = defaultdict(lambda: 0) 

    for word, count in d1val: 
     resd[word] += count 

    for word, count in d2val: 
     resd[word] += count 

    final[k] = [list(i) for i in resd.items()]