【问题标题】:Python: Creating a dictionary using list comprehension from a list using lambdaPython:使用 lambda 从列表中使用列表推导创建字典
【发布时间】:2016-02-04 10:51:04
【问题描述】:

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

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 中使用 : 与在表示键时发生冲突。我还查看了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

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

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

PS:我应该提到另外两个相关的帖子,我在尝试这样做时发现它们很有帮助。第一个是关于using lambda in list comprehension. 另一个是creating a dictionary using list。

【问题讨论】:

    标签: python dictionary lambda list-comprehension


    【解决方案1】:

    要使用字典理解来做你正在尝试的事情,你应该使用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。
    • @AlokLal 在回答中回答了你的问题,请查看。
    • 非常有帮助。谢谢!
    • @AlokLal 很高兴我能提供帮助! :-) ,我还想请您接受一个答案(您认为它最有用),通过单击答案左侧的勾号,这将对社区有所帮助。
    【解决方案2】:

    你想要做的事情可以通过一个简单的字典理解来完成:

    result = {k: lookup.get(k) for k in keys}
    

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

    【讨论】:

    • 感谢您的回答@Klaus,它有帮助。我发布了对先前答案的跟进。
    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多