我有一个N字典列表,以及一个N字符串列表。对于前者的每个字典,我想用后者的相应字符串附加/更新一个键值对。例如:names = [{'First':'John','Last':'Doe'} , {'First':'Jane','Last':'Doe'}]ages = ['21','32']以下循环有效:for i,j in zip(names,ages): i.update({'Age':j}) print(i)部分是为了智力挑战,但部分是为了适应最终的并行处理,我想在没有循环的情况下解决同样的问题。我的两次尝试都没有成功;都返回了None类型的列表:第一次尝试:f = lambda x: x[0].update({'Age':x[1]})out = map(f,zip(names,ages))for i in out: print(i)第二次尝试:out = (i.update({'Age':j}) for i,j in zip(names,ages))for i in out: print(i)是什么赋予了?
1 回答
慕少森
TA贡献2019条经验 获得超9个赞
使用 dict unpacking operator **,应该可以返回一个合并的 dict 作为 map 的结果,而根本不修改原始的。
f = lambda x: {**x[0], 'Age': x[1]}
out = map(f,zip(names,ages))
print(list(out))
# [{'First': 'John', 'Last': 'Doe', 'Age': '21'},
# {'First': 'Jane', 'Last': 'Doe', 'Age': '32'}]
这是一个不太常见的习惯用法,您可以使用它来动态合并字典。当它在几个月后发布时,Python 3.9 将为|运算符添加一个重载,这将允许您做一些类似的事情x[0] | {'Age': x[1]}来更清楚地获得相同的结果,但现在这应该符合您的目的。
这应该使解决方案更容易并行化,但请记住循环for可以很好地用于并行化,只要每个元素都独立于其他元素 - 您可以将列表分成块并将一个块交给每个并行进程. 与您已经使用的方法相比,这种方法的唯一好处是各种并行进程将不再写入内存中的相同数据结构。
添加回答
举报
0/150
提交
取消