更新列表理解中的字典

问题描述 投票:0回答:3

鉴于下面的两个字典,我试图创建一个新字典列表,组合来自一个(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
3个回答
0
投票

澄清问题陈述:

给定一个固定映射

com
和一个包含一系列元素的映射(我会发现名称“nvals”更容易记忆),返回一个映射列表,其中列表的每个元素都有来自
nvals
的值之一作为键
'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}]
>>>

看起来符合要求。

我不得不说,我认为我发现循环更容易阅读。


0
投票

试试这个:

    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()]

你不就是喜欢Python吗?


0
投票

如果说服 Python 执行

.update()
中的
dict
方法,则可以使用推导式:

[n for rt in e.values() for n in [{'n':rt}] if n.update(com) or True]

这里添加了一个条件作为无状态

.update()
操作的执行支架,该操作始终返回
None
。 (NoneType 相当于
False
。)为了确保流程控制始终执行条件,请使用
True
语句设置
or

或者,可以从(始终

None
)结果创建一个集合对象,以确保
True
使其始终执行:

[n for rt in e.values() for n in [{'n':rt}] if (n.update(com),)]

请注意,

(None,)
是一个长度为 1 的元组,其计算结果为
True

© www.soinside.com 2019 - 2024. All rights reserved.