2011-07-28 55 views
3

這是我的第一篇編程文章以及我的第一個程序,所以請耐心等待。Python:使用加法修改字典值

我有一個像這樣初始化的dicionary:

tab = ({'Mike': 0, 'Chad': 15, 'Taylor': 2}) 

我希望能夠爲整數添加到字典中的每個值。
例如,添加5後,該詞典應該是這樣的:

tab = ({'Mike':5, 'Chad': 20, 'Taylor': 7}) 

看來,如果這可以用幾行代碼來完成,但我無法弄清楚。 我試過一個循環:

for k in tab.itervalues(): 
    k = k + 5 

我運行此代碼,然後打印出詞典:

tab = ({'Mike': 0, 'Chad': 15, 'Taylor': 2}) 

這本字典已經發生的變化。我不確定Python是否能將這些值識別爲字符串或整數。我敢肯定,你們中的一些人正在笑我的問題和簡單。感謝您的關注。

+1

您不需要{}周圍的括號。 – utdemir

+0

'k = k + 5'這一行實際上正在創建一個全新的變量。你不能看到它,因爲python隱藏它(這是python的傳遞對象範例的一部分)。但是,這既不是這裏也不是。即使你*可以修改k,它也不會修改字典。通過華夫餅悖論查看正確方法的答案。 –

回答

12

最簡單的方法是?

for k in tab.keys(): 
    tab[k] += 5 
+2

只是'在標籤'k? – utdemir

+0

老實說,我發現tab.keys()更具可讀性,但是這樣做也可以。 –

+0

謝謝。我有很多東西需要學習,我將從循環開始。 – MZ420

6

tab.itervalues()通過值創建迭代器。

你迭代這些,並交替遞交每個值。值爲int s。 在Python中,這些是不可變的

在Python中,語句a += 3被翻譯 - 在大多數個案 - 到a = a + 3a + 3創建一個新的 int對象,其中a已經引用一個int,然後名稱a被反彈到新對象的情況。

所以你改變迭代變量(通過重新綁定),而不是映射中的值(因爲它是不可變的)。

waffle paradox的解決方案通過使用迭代器訪問鍵並重新綁定字典中的值來解決此問題。這很簡單,Pythonic和罰款。

或者,您可以擁抱不變性,並應用功能性編程範例。我們想要創建一個類似於我們所擁有的字典,但增加了鍵的字典;並導致tab引用這個新的字典只是偶然。

這樣:

tab = dict((k, v + 5) for (k, v) in tab.iteritems()) 

這種做法往往會使您的生活更輕鬆,當你基於相同的基本問題有一個更難的問題。

+1

我的自然傾向本來是要改變原始的字典。我喜歡替代方法,我會盡力在未來記住它。 – steveha

+1

現在我們可以在tab.items()中寫出更漂亮的'tab = {k:v + 5 for v,v'}。 –