2017-07-12 4 views
0

文字の文字列の辞書を作成したいと思います。そのキーは一意の文字で、値は最初の文字のインデックスです現れる。 0 '、' i ':1、' s ':2、' p ':8}if文を使ったPython辞書の理解ですが、if文には辞書自体が含まれています

「pythonic」という文字を書き込もうとしましたが、「word =' mississippi 'コード:

dict = {word[i]:i for i in range(len(word)) if word[i] not in dict.keys()} 

しかし、私が得たことであった:{ 'I':10、 'M':0、 'P':9、 'S':6}、辞書wasnかのようであった if文が呼び出されたときに更新され、まだ空でした。

ループの通常は正しいことをした:

for i in range(len(word)): 

    if word[i] not in first_apperance_dict.keys(): 

     dict[word[i]]=i 

出力:{ 'I':1、 'M':0、 'P':8、 'S':2}

それで、なぜですか?この問題のpythonicエレガントなコードはありますか?一般的に、私はリストまたはディクショナリの中でif文に静的な変数を入れるだけですか?

答えて

3

dictは、理解が完了するまで作成されないため、作成しているdictを参照するために、理解を使用することはできません。

一般的に、あなたがここでやっていることをするために内包語を使うことはできません。理解では、各値は反復の1つの値に依存する必要があります。しかし、あなたの計算では、各値はすべてのの値に依存します(作成されるdictへの影響を介して)。

の結果が実際に以前の値に依存していないため、具体的な例がここにあります。後に文字の出現が早いものから値を「上書き」このバージョンで

>>> {char: word.index(char) for char in word} 
{'i': 1, 'm': 0, 'p': 8, 's': 2} 

、しかし、彼らは同じ値で上書きする:あなたはまず直接行うことができます単語の各文字の出現を、したいです、それは効果がありません。でもよりよいバージョンは次のようになります。

>>> {char: word.index(char) for char in set(word)} 
{'i': 1, 'm': 0, 'p': 8, 's': 2} 

この繰り返し処理のみ言葉でユニーク文字を超える、いないすべての文字の上に。

0

@BrenBarnについては既に説明があります。私はちょうどfind()メソッドを使用してあなたを示しています。このメソッドは、stringからcharの最初のオカレンスインデックスを返します。

>>> word = 'mississippi' 
>>> {w:word.find(w) for w in set(word)} 
{'i': 1, 'p': 8, 's': 2, 'm': 0} 
関連する問題