2017-03-03 16 views
0

私はすべての単語とそのタグを取得しようとしており、辞書に数えています。しかし、私はKeyErrorを取得し続けていると私はなぜ理解していない。キーエラーPython

sent = [[('Merger', 'NOUN'), ('proposed', 'VERB')], [('Wards', 'NOUN'), ('protected', 'VERB')]] 

dicts = {} 

for x in sent: 
    for y in x: 
     if y[0] in dicts.keys(): 
      dicts[y[0]][y[1]] = 1 
     else: 
      dicts[y[0]][y[1]] += 1 

エラー:

KeyError    Traceback (most recent call last) 
    <ipython-input-19-17c6695bd911> in <module>() 
    17    dicts[y[0]][y[1]] = 1 
    18   else: 
---> 19    dicts[y[0]][y[1]] += 1 

    KeyError: 'Merger' 
+0

:、あなただけdefaultdict(int)を返し、引数をとらないヘルパー関数を使用することができます] [y [1]] + = 1 'である。あなたはどんなアウトプットを期待していますか? – roganjosh

+0

@roganjoshこんにちは私は入れ子になった辞書を作成しようとしています。合併:{名詞:1}} –

+0

私はTerryAの編集された答えで実際に対処されていると思います。それはちょうどよく見えませんでした、私は何かの流れが起こっていたかどうか疑問に思った。 – roganjosh

答えて

1

あなたの条件文間違った方法ラウンドを持っています。最初に辞書にキーが存在するかどうかをチェックします。そうでなければ、キーを作成します。それから、あなたは入れ子になりました。あなただけが必要ですdicts[y[0]]

notの前にin dicts.keys()を追加してから、[y[1]]を取り除きます。フルで

for x in sent: 
    for y in x: 
     if y[0] not in dicts.keys(): 
      dicts[y[0]] = 1 
     else: 
      dicts[y[0]] += 1 
2

あなたはまたcollections.defaultdictcollections.Counterを見て検討する必要があります。

defaultdictが自動的Counterがカウントのために、具体的dictで、デフォルト値を記入します:

from collections import defaultdict 
from collections import Counter 

sent = [[('Merger', 'NOUN'), ('proposed', 'VERB')], [('Wards', 'NOUN'), ('protected', 'VERB')]] 

dicts = defaultdict(Counter) # A default dictionary of Counters 
for x in sent: 
    for y in x: 
     dicts[y[0]][y[1]] += 1 

print(dicts) 
# defaultdict(<class 'collections.Counter'>, {'Merger': Counter({'NOUN': 1}), 'proposed': Counter({'VERB': 1}), 'Wards': Counter({'NOUN': 1}), 'protected': Counter({'VERB': 1})}) 

Counterをスキップする場合は[0]あなたが高担当者の人から2件の迅速な回答を得たが、私は `dicts [Yの有用性を理解するのに苦労してい

from collections import defaultdict 

def int_dict(): 
    return defaultdict(int) 

dicts = defaultdict(int_dict) 
for x in sent: 
    for y in x: 
     dicts[y[0]][y[1]] += 1 

print(dicts) 
# defaultdict(<function a at 0x112c48048>, {'Merger': defaultdict(<class 'int'>, {'NOUN': 1}), 'proposed': defaultdict(<class 'int'>, {'VERB': 1}), 'Wards': defaultdict(<class 'int'>, {'NOUN': 1}), 'protected': defaultdict(<class 'int'>, {'VERB': 1})}) 
+0

かなり私が投稿しようとしていたので、私は重複しません。 'for 'で解凍することで、タプル上の醜いインデックスアクセスを避けることができます。例えば'for name、typing in x:' –