【问题标题】:update dict in list comprehension更新列表理解中的字典
【发布时间】:2016-05-07 05:22:45
【问题描述】:

鉴于下面的两个字典,我正在尝试创建一个新字典列表,该列表将一个 (com) 中的项目组合在一起,这将对每个成员重复,只有第二个 (e) 的值,在一个时间,在键'n'下。例如。第一个列表成员是: {'n': 330, 'b': 2, 'a': 1} 如果我在列表推导中使用 update() 将第一个字典中的密钥对值添加到结果中,我会得到一个包含两个 None 成员的列表。 我尝试了不同的方法来写这个,例如在 python 2 和 3 上使用 map();所以我问专家。

>>> com
{'b': 2, 'a': 1}
>>> e
{'p': 330, 'r': 220}
>>> [n for rt in e.values() for n in [{'n':rt}]]
[{'n': 330}, {'n': 220}]
>>> [n.update(com) for rt in e.values() for n in [{'n':rt}]]
[None, None]

【问题讨论】:

  • 不清楚你在问什么。

标签: python dictionary list-comprehension


【解决方案1】:

澄清问题陈述:

给定一个固定映射 com 和一个包含一系列元素的映射(我会发现名称 'nvals' 更容易助记),返回一个映射列表,其中列表的每个元素都有来自 @ 的值之一987654322@作为键'n'的值,以及com的所有元素。

所以下面的代码返回了需要的结果:

>>> com = {'b': 2, 'a': 1}
>>> nvals = {'p': 330, 'r': 220}
>>> l = []
>>> for n in nvals.values():
...     d = dict(com) # Make sure to clone the dictionary.
...     d["n"] = n
...     l.append(d)
...
>>> l
[{'n': 330, 'b': 2, 'a': 1}, {'n': 220, 'b': 2, 'a': 1}]
>>>

问题在于这不是列表理解

>>> [dict(list(com.items()) + [('n', n)]) for n in nvals.values()]
[{'n': 330, 'b': 2, 'a': 1}, {'n': 220, 'b': 2, 'a': 1}]
>>>

似乎符合要求。

我不得不说,我觉得循环更容易阅读。

【讨论】:

  • 注意:我确信您的变量名称在更广泛的程序的上下文中是助记符 - 但对于 这个问题,我认为我的更好。
【解决方案2】:

试试这个:

    com = {'b': 2, 'a': 1}
    e = {'p': 330, 'r': 220}
    res = [{i:j for i,j in com.items()+[("n",v)]} for v in e.values()]

或者这个:

    res = map(lambda x: dict([("n",x)]+com.items()), e.values())

或许:

    res = [dict(zip(["n"]+com.keys(),[v]+com.values())) for v in e.values()]

你不只是喜欢蟒蛇吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-09
    • 2011-03-14
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多