为了账号安全,请及时绑定邮箱和手机立即绑定

如何在没有循环的情况下更新字典列表?

如何在没有循环的情况下更新字典列表?

Go
狐的传说 2023-06-20 13:48:35
我有一个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贡献1815条经验 获得超10个赞

使用 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可以很好地用于并行化,只要每个元素都独立于其他元素 - 您可以将列表分成块并将一个块交给每个并行进程. 与您已经使用的方法相比,这种方法的唯一好处是各种并行进程将不再写入内存中的相同数据结构。


查看完整回答
反对 回复 2023-06-20
  • 1 回答
  • 0 关注
  • 116 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信