2012-03-06 86 views
4

我有一本字典和一個特定的鍵,我說5個可能的新值。所以我試圖通過使用一個簡單的lambda函數來創建原始字典的5個副本,該函數將替換該特定鍵的值並返回主字典的副本。返回字典修改

# This is the master dictionary. 
d = {'fn' : 'Joseph', 'ln' : 'Randall', 'phone' : '100' } 
# Joseph has got 4 other phone numbers 
lst = ['200', '300', '400', '500'] 
# I want 4 copies of the dictionary d with these different phone numbers 
# Later I would want to do some processing with those dictionary without affecting d 

所以我想這樣做:

# y is the list I want to hold these copies of dictionaries with modified values 
i = d.copy() 
y = map(lambda x : (i.update({'phone' : x})) and i, lst) 

我認爲這將返回字典列表和他們每個人都會有電話號碼分別變爲200,300,400和500。我可以放置一個循環並創建副本,並使用一種天真的方法改變它們,但我想探索並知道如何利用lambda來實現這一點。

在此先感謝。

+0

你還試過了什麼? – Marcin 2012-03-06 18:14:09

+2

@Marcin:「我想探索並知道如何利用它這是一個很棒的網站! – Benjamin 2012-03-06 18:16:48

回答

14

您可以使用列表理解:

>>> d = {'fn' : 'Joseph', 'ln' : 'Randall', 'phone' : '100' } 
>>> lst = ['200', '300', '400', '500'] 
>>> [dict(d, phone=x) for x in lst] 
[{'ln': 'Randall', 'phone': '200', 'fn': 'Joseph'}, {'ln': 'Randall', 'phone': '300', 'fn': 'Joseph'}, {'ln': 'Randall', 'phone': '400', 'fn': 'Joseph'}, {'ln': 'Randall', 'phone': '500', 'fn': 'Joseph'}] 

如果你仍然堅持使用map和拉姆達(這不完全一樣,只是有點慢):

>>> map(lambda x: dict(d, phone=x), lst) 
[{'ln': 'Randall', 'phone': '200', 'fn': 'Joseph'}, {'ln': 'Randall', 'phone': '300', 'fn': 'Joseph'}, {'ln': 'Randall', 'phone': '400', 'fn': 'Joseph'}, {'ln': 'Randall', 'phone': '500', 'fn': 'Joseph'}] 

由方式,你的方法沒有按預期工作的原因是因爲.update()修改了字典,而不是創建一個反映更新的新字典。它也不返回結果,所以lambda的計算結果爲None(並且你可能找回了一個像[None, None, None, None]的列表。

+0

(+1)這比我的建議要好得多 – NPE 2012-03-06 18:17:39

+3

@aix:謝謝:)最近我學到了這個技巧,所以這真是一個很棒的網站! – 2012-03-06 18:18:17

+0

woow !!很酷的解決方案! :) – 2012-03-06 18:20:44