2016-11-14 16 views
0

私は辞書のリストを持っており、リスト内の項目の頻度を見つけたいと思います。私は単にcollections.Counter()を使用しますが、というエラーがスローされます。辞書のリストで項目の頻度を見つけよう

unhashable type: 'dict' 

マイコード:

for dep in dep_list: 
    dep_dict['parent'] = dep.split(',')[0] 
    dep_dict['parent_pos'] = dep.split(',')[1] 
    dep_dict['parent_dep'] = dep.split(',')[2] 
    dep_dict['child'] = dep.split(',')[3] 
    dep_dict['child_pos'] = dep.split(',')[4] 
    dep_dict['child_dep'] = dep.split(',')[5] 
    dep_dict['avl_sent'] = item['avl_sent'] 
    dep_dict['avl_author_type'] = item['avl_author_type'] 
    dep_dict['avl_brand_1'] = item['avl_brand_1'] 
    final_list.append(dep_dict.copy()) 
counts = collections.Counter(final_list) 
print counts 

final_listを内容は、私がしたい正確に何です。私はただの周波数が欲しい。私は最終的にすべてをjsonとして出力したいと思います。

誰かがこれを手伝ってくれますか?コメントで述べたnamedtupleについては詳しく説明しprint final_list

[{'parent_pos': u'VBD', 'avl_author_type': u'individual', 'parent': u'get', 'avl_sent': u'positive', 'parent_dep': u'root', 'child_pos': u'NN', 'child_dep': u'dobj', 'child': u'event', 'avl_brand_1': u'Kennedy Health'}, {'parent_pos': u'VBD', 'avl_author_type': u'individual', 'parent': u'get', 'avl_sent': u'positive', 'parent_dep': u'root', 'child_pos': u'NNS', 'child_dep': u'dobj', 'child': u'emergingleaders', 'avl_brand_1': u'Kennedy Health'}, {'parent_pos': u'VBD', 'avl_author_type': u'individual', 'parent': u'get', 'avl_sent': u'positive', 'parent_dep': u'root', 'child_pos': u'NN', 'child_dep': u'pobj', 'child': u'company', 'avl_brand_1': u'Kennedy Health'}, {'parent_pos': u'NN', 'avl_author_type': u'individual', 'parent': u'event', 'avl_sent': u'positive', 'parent_dep': u'dobj', 'child_pos': u'NN', 'child_dep': u'nn', 'child': u'networking', 'avl_brand_1': u'Kennedy Health'}, {'parent_pos': u'NN', 'avl_author_type': u'individual', 'parent': u'company', 'avl_sent': u'positive', 'parent_dep': u'pobj', 'child_pos': u'NN', 'child_dep': u'nn', 'child': u'brewing', 'avl_brand_1': u'Kennedy Health'}, {'parent_pos': u'VBD', 'avl_author_type': u'individual', 'parent': u'do', 'avl_sent': u'positive', 'parent_dep': u'root', 'child_pos': u'DT', 'child_dep': u'dobj', 'child': u'this', 'avl_brand_1': u'Virtua'}, {'parent_pos': u'VBD', 'avl_author_type': u'individual', 'parent': u'do', 'avl_sent': u'positive', 'parent_dep': u'root', 'child_pos': u'NN', 'child_dep': u'pobj', 'child': u'showdown', 'avl_brand_1': u'Virtua'}, {'parent_pos': u'VBD', 'avl_author_type': u'individual', 'parent': u'do', 'avl_sent': u'positive', 'parent_dep': u'root', 'child_pos': u'PRP', 'child_dep': u'pobj', 'child': u'us', 'avl_brand_1': u'Virtua'}, {'parent_pos': u'VBD', 'avl_author_type': u'individual', 'parent': u'do', 'avl_sent': u'positive', 'parent_dep': u'root', 'child_pos': u'PRP', 'child_dep': u'nsubj', 'child': u'we', 'avl_brand_1': u'Virtua'}, {'parent_pos': u'VBD', 'avl_author_type': u'individual', 'parent': u'do', 'avl_sent': u'positive', 'parent_dep': u'root', 'child_pos': u'PRP', 'child_dep': u'nsubj', 'child': u'it', 'avl_brand_1': u'Virtua'}, {'parent_pos': u'NN', 'avl_author_type': u'individual', 'parent': u'showdown', 'avl_sent': u'positive', 'parent_dep': u'pobj', 'child_pos': u'JJ', 'child_dep': u'amod', 'child': u'final', 'avl_brand_1': u'Virtua'}]

ERROR in prepare final output 
unhashable type: 'dict' 
+0

あなたは 'final_list'の初期化を示し、できますか? – WorldSEnder

+0

'print(final_list)'を実行し、問題の結果を追加してください。ネストされた辞書は使用できません。 – furas

+1

'dep_dict'の代わりに' namedtuple'を使う –

答えて

1

EDIT

出力例:

from collections import namedtuple 

mytuple = namedtuple('mytuple', (
    'parent_pos', 'parent_dep', 'child', 'child_pos', 
    'child_dep', 'avl_sent', 'avl_author_type', 'avl_brand_1' 
)) 
for dep in dep_list: 
    dep_tokens = dep.split(',') 
    dep_tuple = mytuple(
     parent=dep_tokens[0], 
     parent_pos=dep_tokens[1], 
     parent_dep=dep_tokens[2], 
     child=dep_tokens[3], 
     child_pos=dep_tokens[4], 
     child_dep=dep_tokens[5], 
     avl_sent=item['avl_sent'], 
     avl_author_type=item['avl_author_type'] 
     avl_brand_1=item['avl_brand_1'] 
    ) 
    final_list.append(dep_tuple) 
counts = collections.Counter(final_list) 
print counts 
0

あなたは、このような項目の周波数を取得することができます:

from collections import Counter 
import json 

final_list = [{'parent_pos': u'VBD', 'avl_author_type': u'individual', 'parent': u'get', 'avl_sent': u'positive', 'parent_dep': u'root', 'child_pos': u'NN', 'child_dep': u'dobj', 'child': u'event', 'avl_brand_1': u'Kennedy Health'}, {'parent_pos': u'VBD', 'avl_author_type': u'individual', 'parent': u'get', 'avl_sent': u'positive', 'parent_dep': u'root', 'child_pos': u'NNS', 'child_dep': u'dobj', 'child': u'emergingleaders', 'avl_brand_1': u'Kennedy Health'}, {'parent_pos': u'VBD', 'avl_author_type': u'individual', 'parent': u'get', 'avl_sent': u'positive', 'parent_dep': u'root', 'child_pos': u'NN', 'child_dep': u'pobj', 'child': u'company', 'avl_brand_1': u'Kennedy Health'}, {'parent_pos': u'NN', 'avl_author_type': u'individual', 'parent': u'event', 'avl_sent': u'positive', 'parent_dep': u'dobj', 'child_pos': u'NN', 'child_dep': u'nn', 'child': u'networking', 'avl_brand_1': u'Kennedy Health'}, {'parent_pos': u'NN', 'avl_author_type': u'individual', 'parent': u'company', 'avl_sent': u'positive', 'parent_dep': u'pobj', 'child_pos': u'NN', 'child_dep': u'nn', 'child': u'brewing', 'avl_brand_1': u'Kennedy Health'}, {'parent_pos': u'VBD', 'avl_author_type': u'individual', 'parent': u'do', 'avl_sent': u'positive', 'parent_dep': u'root', 'child_pos': u'DT', 'child_dep': u'dobj', 'child': u'this', 'avl_brand_1': u'Virtua'}, {'parent_pos': u'VBD', 'avl_author_type': u'individual', 'parent': u'do', 'avl_sent': u'positive', 'parent_dep': u'root', 'child_pos': u'NN', 'child_dep': u'pobj', 'child': u'showdown', 'avl_brand_1': u'Virtua'}, {'parent_pos': u'VBD', 'avl_author_type': u'individual', 'parent': u'do', 'avl_sent': u'positive', 'parent_dep': u'root', 'child_pos': u'PRP', 'child_dep': u'pobj', 'child': u'us', 'avl_brand_1': u'Virtua'}, {'parent_pos': u'VBD', 'avl_author_type': u'individual', 'parent': u'do', 'avl_sent': u'positive', 'parent_dep': u'root', 'child_pos': u'PRP', 'child_dep': u'nsubj', 'child': u'we', 'avl_brand_1': u'Virtua'}, {'parent_pos': u'VBD', 'avl_author_type': u'individual', 'parent': u'do', 'avl_sent': u'positive', 'parent_dep': u'root', 'child_pos': u'PRP', 'child_dep': u'nsubj', 'child': u'it', 'avl_brand_1': u'Virtua'}, {'parent_pos': u'NN', 'avl_author_type': u'individual', 'parent': u'showdown', 'avl_sent': u'positive', 'parent_dep': u'pobj', 'child_pos': u'JJ', 'child_dep': u'amod', 'child': u'final', 'avl_brand_1': u'Virtua'}] 

counter = Counter() 
for d in final_list: 
    counter.update(d.values()) 

print(json.dumps(counter, indent=4)) 

出力:例の入出力を与える

{ 
    "VBD": 8, 
    "showdown": 2, 
    "it": 1, 
    "individual": 11, 
    "JJ": 1, 
    "DT": 1, 
    "amod": 1, 
    "event": 2, 
    "networking": 1, 
    "nn": 2, 
    "positive": 11, 
    "nsubj": 2, 
    "emergingleaders": 1, 
    "Virtua": 6, 
    "PRP": 3, 
    "Kennedy Health": 5, 
    "final": 1, 
    "do": 5, 
    "we": 1, 
    "get": 3, 
    "company": 2, 
    "brewing": 1, 
    "NN": 8, 
    "this": 1, 
    "NNS": 1, 
    "us": 1, 
    "dobj": 4, 
    "pobj": 5, 
    "root": 8 
} 
+0

'from pprint import pprint'と' pprint(counter) 'を使うこともできます –

+0

@JohnLaRooy:私は知っていますが、' json.dumps'の出力はより良いそれはソリューションの重要な部分ではありません。 – martineau

関連する問題