2017-07-12 64 views
0

我想創建一個字母串的字典,其中的關鍵是唯一的字母和值是指數的字母第一齣現。例如:word ='mississippi',正確答案應該是{'m':0,'i':1,'s':2,'p':8}Python語言詞典與if語句的理解,但if語句包含詞典本身

我試圖寫'pythonic'代碼:

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循環做了正確的事:

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

你不能使用理解來引用它正在創建的字典,因爲在理解結束之前不會創建字典。

一般來說,你不能用理解去做你在做的事情。在理解中,每個值應該僅取決於迭代中的一個值。但在你的計算中,每個值取決於的所有以前的值(通過它們對正在創建的字典的影響)的結果。

對於你的具體例子,這裏有一個更簡單的方法,因爲你想要的結果實際上並不依賴於以前的值。你只是想在這個詞的每個字符的第一次出現,它可以直接完成:

>>> {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()方法向你展示。該方法返回給定stringchar的第一個出現索引。

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