2013-06-01 125 views
-2

更新後的dict迭代dict只保留最後一個迭代對。Python字典沒有更新

示例:

# DICTIONARY PROBLEM 
class Dict_ator(object): 
    def __init__(self, str, int): 
     self.string = str 
     self.integer = int 

boogeyman = [] 
i = 1 
for char in "boogeyman" : 
    boogeyman.append(Dict_ator(char, i)) 
    i += 1 

dictonary = {} 
for b in boogeyman : 
    dictonary.update(s = b.string, i = b.integer) 

我做錯了嗎?

+0

你想要什麼輸出? – Eric

+0

這與您遇到的問題無關,但使用名稱'str'和'int'作爲變量名(通常在'Dict_ator .__ init__'中使用)通常是一個糟糕的主意。這是因爲它們是內置對象的名稱,並且發現它們在某些時候會做某些事情可能非常令人驚訝。當它在一個函數的本地命名空間中時並不是太糟糕,但是如果你曾經在模塊級別做過它,它會導致非常混亂的錯誤。 – Blckknght

+0

[python字典更新方法]的可能重複(http://stackoverflow.com/questions/173290/python-dictionary-update-method) – Dukeling

回答

2

你一遍又一遍的設置相同的密鑰:

dictonary.update(s = b.string, i = b.integer) 

通過使用關鍵字,您要設置兩個鍵; si;字典的定義是,它們將鍵映射到值,其中鍵是唯一的。

如果您想爲循環中的每個元素設置不同的鍵值組合,請設置不同的鍵。例如,使用b.string每個鍵和b.integer的價值觀,作爲一個元組通過這兩個:

dictonary.update((b.string, b.integer)) 

或只設置直接的鍵值使用分配:

dictonary[b.string] = b.integer 

你替換整個循環使用字典理解:

dictionary = {b.string: b.integer for b in boogeyman} 

你的第一個循環可以使用enumerate()與起始值被簡化和列表理解:

boogeyman = [Dict_ator(char, i)) for i, char in enumerate("boogeyman", 1)] 

如果您不需要Dict_ator對象,你可以使用相同的enumerate()循環來構建詞典:

dictionary = {char: i for i, char in enumerate('boogeyman', 1)} 

交換整數和字符部件如果你想讓你的字典以另一種方式映射。

+1

或者一行代碼:'dict((s,i)for i,s列舉(「boogeyman」,1))'。 –

+0

非常感謝你......你的回答啓發了我。 :) – Alex

1

一號線可能會解決你的問題:

>>> {i: c for i, c in enumerate("boogeyman", 1)} 
{1: 'b', 2: 'o', 3: 'o', 4: 'g', 5: 'e', 6: 'y', 7: 'm', 8: 'a', 9: 'n'} 
+0

當然,你現在擁有的基本上是一個基於1的清單,這個清單具有可疑價值。 – Eric

+0

這是OP想要的。 本身是的。但是您可能需要它才能進行下一步更新以獲得下一個單詞或其他內容。 –

1

這工作

class Dict_ator(object): 
    def __init__(self, str, int): 
     self.string = str 
     self.integer = int 

boogeyman = [] 
i = 1 
for char in "boogeyman" : 
    boogeyman.append(Dict_ator(char, i)) 
    i += 1 

dictonary = {} 
for b in boogeyman : 
    dictonary[b.string] = b.integer 

Dict_ator ......只存儲一個字符和相關聯的位置...好像太多了。此外,爲什麼不是你直接添加到字典的位置,這樣的

dictonary = {} 
i = 1 
for char in "boogeyman" : 
    dictonary[char] = i 

簡單,嗯?

+0

它也適用。謝謝。不過,我在代碼中發現錯誤:dictonary!= dictionary。哈! – Alex