Skip to main content
 首页 » 编程设计

Python:使用 lambda 从列表中使用列表理解创建字典

2025年05月04日13hnrainll

从概念上讲,这是我想要做的:

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'} 

基于 this post about dictionary comprehension syntax 中的建议我可以使用 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 中使用 : 表示 key 。我还查看了 original 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 

我做错了什么?是否可以做我想做的事情,即使用 v2.7 字典理解语法和 lambda?

请注意,我只是出于好奇问这个;这并不是说我有编写这样的生产代码的冲动,需要专家才能理解!

PS:我应该提一下我在尝试执行此操作时发现有帮助的另外两个相关帖子。首先是关于 using lambda in list comprehension.另一个是 creating a dictionary using list .

请您参考如下方法:

要用字典理解来做你正在尝试的事情,你应该使用 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)