1

2 つの辞書 (TEXT FILES!) をマージできるプログラムを作成しようとしています。これらの辞書は、別のプログラムによって別のコーパスから索引付けされた (そしてテキスト・ファイルに入れられた) 名詞と動詞で構成されています。これは、これらの辞書の形式です。

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]] 値などとして。これが必要なのは、すべての項目をループして、どの動詞で何回出現するかをカウントできるようにするためです。

4

2 に答える 2

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()}
于 2012-06-14T22:18:45.583 に答える
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()]
于 2012-06-14T22:24:32.070 に答える