2016-11-15 11 views
1

辞書を使用して、指定した文字列の単語頻度をカウントしようとしていました。セイ: 辞書の理解のある単語頻度

s = 'I ate an apple a big apple' 

は、私はおそらく collections.Counterを使用することである単語の出現頻度をカウントするための最良の方法を理解しています。しかし、私は辞書の理解を使ってこれを解決できるかどうかを知りたい。

(辞書の理解なし)私のオリジナルのメソッドは

dict = {} 
for token in s.split(" "): 
    dict[token] = dict.get(token, 0) + 1 

だったし、それが正常に動作します:

dict 
{'I': 1, 'a': 1, 'an': 1, 'apple': 2, 'ate': 1, 'big': 1} 

私は

dict = {} 
dict = {token: dict.get(token, 0) + 1 for token in s.split(" ")} 

のように、これに辞書内包表記を使用しようとしましたしかし、これはうまくいかなかった。

辞書の理解には何が問題なのですか?それは私が理解の中で使用したので、私がdict.get('apple', 0と呼ぶたびに)理解で、私は0を得ますか?しかし、私はこれをテストする方法を知らないので、私は100%確実ではありません。

P.S.何か違いがある場合は、私はPython 3を使用しています。

+2

これはずっと前に 'collections.Counter'(dictサブタイプ)が解決したものです –

+1

これは組み込みであるため変数名としてdictを使用しませんでしたので、何かを壊す可能性があります – e4c5

+1

変数' dict' isn理解が完全に計算されるまで更新されないので、 'dict。get(token、0) 'の中で、前の行の空の辞書とのみ協議が行われます。 – khelwood

答えて

1

操作によってコード操作を行うと、何が間違っているかがわかります。

まず、dictに空のdictを設定します。 (コメントに記載されているように、それを自分の変数名に使うのは悪い考えですが、それはここでは問題ではありません)

次に、あなたのディクテーションの理解度が評価されます。この時点で、名前dictはまだ空のdictを参照しています。したがって、いつでもdict.get(whatever, 0)を実行するたびに、常にデフォルトになります。

最後に、入力されたdictが名前dictに再割り当てされ、以前に存在していた空のものが置き換えられます。

1

あなたとしても、list.count()を使用することができます動作するようにあなたの辞書の理解のために

s = 'I ate an apple a big apple' 

print {token: s.split().count(token) for token in set(s.split())} 
0

、あなたは自分自身の内側理解への参照が必要です。建設中の理解を参照する「__me__」のようなものがあった場合には、このような何かが

{token: __me__.get(token, 0) + 1 for token in s.split(" ")} 

を働くだろう。 Python 3では、これを行うための文書化された方法はありません。

this answerによれば、文書化されていない「実装アーティファクト」(Pythonユーザは依存してはならない)をPython 2.5,2.6で使用して自己参照リストの理解を書くことができます。多分、Python 3の辞書の解説にも同様のハックが存在します。

関連する問題