2016-03-26 11 views
1

あらかじめ決められていないキーでPython辞書を初期化するにはどうすればよいですか?新しいキーでPython辞書を初期化する

dict = {}で辞書を初期化すると、新しいキーと値のペアを入力すると、キーエラーが表示されます。

回避策は、try-exceptを実行して、既存のキーに最初にアクセスしようとするか、または新しいキーが失敗した場合に辞書を初期化することです。具体的な例としては、(このコード例はKey Errorにつながる)テキスト内の単語を数えることになります。

wordcount = {} 
for word in text: 
    wordcount[word] += 1 
+0

あなたの辞書を作成したり、語数を使用するdefaultdict(int型)のいずれかを使用することができます[単語] = wordcount.get何 'と(ワード、0)+ 1 –

+0

スタート:collectionsモジュールからも仕事をするだろうワードカウント[単語] + = 1'は簡略化していません – woozyking

+0

他のユーザーがあなたの質問に投票することを望まない場合、あなたの問題を理解するのに役立ちます。あなたの質問は、Python言語の使用を考慮して、あなたのPythonコードを過ぎてください。コードを見て、次に何が著者の意図であるかを理解しようとするだけで、何が間違っているのかを簡単に伝えることができます。 – IOR88

答えて

0

あなたは、あなたがそれら(+=1)をインクリメントしようとする前に、キーを初期化することを確認する必要があります。これを試してみてください:

wordcount = {} 
text = ["word","foo","word","word","bar","bar","word","something"] 
for word in text: 
    if word in wordcount: # tests to see if the key exists already 
     wordcount[word] += 1 
    else: # initializes the key to 1 
     wordcount[word] = 1 
print(wordcount) 
# prints {'bar': 2, 'word': 4, 'something': 1, 'foo': 1} 
0

まず、あなたのdictにキーと値のペアを追加する必要があります。あなたがやっているアプローチで

wordcount = {} 
for word in text: 
    if word not in wordcount: 
     wordcount[word] = 0 
    wordcount[word] += 1 
+0

4行目で、 'wordcount [word]'を '1'ではなく' 0'に設定してください。 – AMACB

+0

@AMACBあなたは正しいですか、または「続行しますか」: –

2

、あなたはこれはキーがinキーワードを使って、すでに存在しているかどうかを確認するためにチェックしてやるべきこと方法。それは、あなたのインクリメントを行うならば、そうでない場合はちょうどこのような1を割り当てる:あなたが実際にcollectionsモジュール(documentation)からdefaultdictを使用している場合は、コメントパー

wordcount = {} 
text = ["this", "is", "my", "sentence", "yes", "it", "is", "my", "stuff"] 
for word in text: 
    if word in wordcount:  
     wordcount[word] += 1 
    else: 
     wordcount[word] = 1 

print(wordcount) 

# {'yes': 1, 'stuff': 1, 'sentence': 1, 'my': 2, 'is': 2, 'this': 1, 'it': 1} 

は、あなたがこの状況を回避することができます。 defaultの値を辞書エントリに設定して、+=に進むだけです。例:あなたはcollectionsモジュール(documentation)からCounterと呼ばれるための今すぐ

from collections import defaultdict 
my_dict = defaultdict(int) 
text_list = ["this", "is", "my", "sentence", "yes", "it", "is", "my", "stuff"] 

for text in text_list: 
    my_dict[text] += 1 

print(my_dict) 

# defaultdict(<class 'int'>, {'sentence': 1, 'this': 1, 'is': 2, 'my': 2, 'yes': 1, 'it': 1, 'stuff': 1}) 

、あなたは、単にテキスト内の単語を数えるしようとしている場合は、すでにこれを行うには、内蔵のものがあります。これは、すべての同様の要素の数を維持します。例を観察してください:

from collections import Counter 
text = ["this", "is", "my", "sentence", "yes", "it", "is", "my", "stuff"]  
my_count_dict = Counter(text) 

print(my_count_dict) 

Counter({'my': 2, 'is': 2, 'stuff': 1, 'this': 1, 'it': 1, 'sentence': 1, 'yes': 1}) 

最も頻繁に出力順に注意してください。あなたが最も一般的な単語を取得する必要がある場合は、それにmost_commonを呼び出す:

print(my_count_dict.most_common(1)) 
# [('my', 2)] 
+0

@Alphaはアップデートをチェックします。私はdefaultdictの例を追加しました – idjaw

+0

Counter(btw、ありがとう!働いています)を使用して1つの問題は、私は最後に並べ替えるし、辞書がソートにもっと適しているようです... – Alpha

+0

辞書は順不同です。しかし、ドキュメントを見て、自分の出力から観察すると、最も頻繁な文字で '順序付けされている'というコレクションのカウンターになります。さらに、最も頻繁な文字が必要な場合は、.most_common(1)を呼び出します。例を示します – idjaw

2

必要がありませんが、定義済みの値を使用して辞書を初期化します。

また除く任意の試みを/必要はありませんが、ちょうどPythonのdefaultdictintに設定されたデフォルトのタイプを使用する:あなただけのリスト、Pythonで単語をカウントする必要がある場合は、

from collections import defaultdict 
wordcount = defaultdict(int) 
for word in text: 
    wordcount[word] += 1 

しかし、コレクションにもCounterというヘルパークラスがありました。

0

私は言葉のdictを取得することですここにあなたの目的を理解している場合:

>>> text = ["this", "is", "my", "sentence", "yes", "it", "is", "my", "stuff"] 
>>> 
>>> {c:text.count(c) for c in text} 
{'it': 1, 'my': 2, 'yes': 1, 'is': 2, 'stuff': 1, 'this': 1, 'sentence': 1} 

、あるいはまたCounter:マッピングをカウントし、その後、あなたはまた、辞書の理解(idjawの例を取る)でそれを行うことができます

>>> from collections import Counter 
>>> 
>>> c = Counter() 
>>> 
>>> for word in text: 
     c[word] += 1 


>>> c 
Counter({'my': 2, 'is': 2, 'it': 1, 'yes': 1, 'stuff': 1, 'this': 1, 'sentence': 1}) 
>>> 
+0

この場合、そのような理解の中にカウントを置くと 'O(n^2)'になります – idjaw

+0

@ idjaw ... correct ...それで、私は 'Counter'ソリューションも含めました...ヘッドアップをありがとう –

関連する問題