2012-03-06 85 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