鉴于下面的两个字典,我试图创建一个新字典列表,组合来自一个(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]
澄清问题陈述:
给定一个固定映射
和一个包含一系列元素的映射(我会发现名称“nvals”更容易记忆),返回一个映射列表,其中列表的每个元素都有来自com
的值之一作为键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}]
>>>
看起来符合要求。
我不得不说,我认为我发现循环更容易阅读。
试试这个:
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吗?
如果说服 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
。