返回修改后的字典副本

5

我有一个字典,对于一个特定的键,我有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函数来实现这一目标。
提前感谢。

2
@Marcin:“我想探索并了解如何利用lambda来实现这一目标。” - Benjamin
1个回答

16
你可以使用列表推导式:

你可以使用列表推导式:

>>> 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和lambda表达式(这与使用for循环完全相同,只是速度稍慢):

>>> 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]这样的列表)。

这比我的建议好多了。 - NPE
3
@aix: 谢谢 :) 我最近在 Stack Overflow 上学到了这个技巧,这真是一个很棒的网站! - Niklas B.
好的。当我尝试这个操作时,我得到了一个“None”列表。 太棒了!谢谢 :-) 列表推导式太酷了。用Python有多酷,无法停止惊讶。 - Vijay Shankar Kalyanaraman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接