Python:使用lambda从列表推导式创建字典

6

概念上,我想要做的是:

lookup = {'A': 'aaa', 'B': 'bbb', 'C': 'ccc'}
keys = ['A', 'B', 'Z'] # Note 'Z' does not exist in dict
result = {}
for key in keys:
    if key in lookup:
        result[key] = lookup[key]
    else:
        result[key] = None

上述代码生成如下结果,即:
# result == {'A': 'aaa', 'Z': None, 'B': 'bbb'}

根据这篇关于Python字典推导式语法的帖子,我能够使用v2.6语法完成以下操作:

result = dict((lambda x: (x, lookup[x]) if x in lookup else (x, None))(key) for key in keys)

这会产生相同的结果。

然而,我希望能够像v2.7风格中提到的那样做(在上面的帖子中也有提到)。但似乎不起作用。

result = { (lambda x: x: a_dict[x] if x in a_dict else x: None)(key) for key in a_list }

在使用lambda时,我好像遇到了使用 : 表示键的问题。我也查看了原始PEP文档中给出的示例,但它们也没有提供任何指导。

以下是命令行的输出:

>>> result = { (lambda x: x : a_dict[x] if x in a_dict else x: None)(key) for key in a_list }
  File "<stdin>", line 1
    result = { (lambda x: x : a_dict[x] if x in a_dict else x: None)(key) for key in a_list }
                            ^
SyntaxError: invalid syntax

我做错了什么?我是否可以做我正在尝试做的事情,即使用lambda的v2.7字典推导式语法?
请注意,我之所以问这个问题,只是出于好奇,而不是因为我有写这样需要专家才能理解的生产代码的强迫症!
PS:我应该提到另外两篇相关帖子,它们在我尝试做这件事时很有帮助。第一篇是关于在列表推导中使用lambda。另一篇是使用列表创建字典
2个回答

16

如果你想使用字典推导式实现你的目标,你应该使用dict.get()方法。例如 -

>>> lookup = {'A': 'aaa', 'B': 'bbb', 'C': 'ccc'}
>>> keys = ['A', 'B', 'Z']
>>> result = {key:lookup.get(key) for key in keys}
>>> result
{'Z': None, 'A': 'aaa', 'B': 'bbb'}

dict.get()方法在字典中找不到键时返回None。你也可以为dict.get()指定第二个参数,如果你要获取的键不存在于字典中,则会返回默认值。


回答这个问题,你无法在字典推导式中使用lambda来返回类似键:值对的结果(因为:语法无效)。如果你想这样做,应该使用带有生成器表达式的dict()函数,例如 -

result = dict((lambda x: (x,a_dict[x]) if x in a_dict else (x,None))(key) for key in a_list)

或者更易读的map()版本 -

result = dict(map((lambda x: (x,a_dict[x]) if x in a_dict else (x,None)), a_list)

谢谢@Anand,这很有帮助。两个答案都避免了我使用lambda的必要性。然而,我的问题的第二部分仍未得到回答,即在使用v2.7字典推导语法时是否可能使用lambda。 - Alok Lal
@AlokLal 在答案中回答了你的问题,请查看。 - Anand S Kumar
非常有帮助。谢谢! - Alok Lal

4
你想要做的事情可以通过简单的字典推导来实现:
result = {k: lookup.get(k) for k in keys}

k将会是键,lookup.get(k)将会是值。 .get()会从字典中获取一个键的值,如果不存在则返回None。默认值也可以作为第二个参数设置。


谢谢你的回答,@Klaus,很有帮助。我在之前的回答下面发了一个追问。 - Alok Lal

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