Python如何通过列表/字典推导式合并字典与整数列表新增payroll字段
问题背景
现有两个列表,一个是存储人员信息的字典列表,一个是对应薪资的整数列表:
x = [ { "name": "tom", "job": "judge" }, { "name":"bob", "job": "policeman" } ] y = [1000, 2200]
需要按位置配对两个列表,给每个字典追加"payroll": 对应薪资的键值对,期望输出:
[ { "name": "tom", "job": "judge", "payroll": 1000 }, { "name":"bob", "job": "policeman", "payroll": 2200 } ]
正确的推导式实现
最简洁、可读性最好的写法是用字典解包配合列表推导,不需要嵌套遍历字典的键值对:
z = [{**d, "payroll": pay} for d, pay in zip(x, y)]
这个写法会生成全新的字典,不会修改原x列表里的内容,没有副作用,所有Python 3.5+版本都支持。
如果需要用字典合并运算符实现,也可以写成:
z = [d | {"payroll": pay} for d, pay in zip(x, y)]
注意:|合并字典的语法仅支持Python 3.9及以上版本
如果一定要严格用嵌套字典推导式的写法,可以参考下面的实现,不过可读性比上面两种差很多:
z = [ {k: v for k, v in {**d, "payroll": pay}.items()} for d, pay in zip(x, y) ]
原写法的问题
- 你之前写的双层循环推导式
[{k: v, "value": o} for d, o in z for k, v in d.items()]逻辑错误:内层循环会遍历每个字典的所有键值对,每遍历一个键就生成一个独立字典,最终结果是把原字典拆成了多个零散字典,不是每个原字典对应一个结果字典。 - 你最初写的循环实现还有个隐藏bug:
zip()返回的是一次性迭代器,遍历完第一轮for循环之后迭代器就已经耗尽,后面的列表推导式[i[0] for i in z]实际拿到的是空内容,之前能跑通是因为调试时重复执行重新生成了zip对象。 - 原循环写法直接修改了原
x列表里的字典,会产生副作用,如果后续代码还要用到原始的x数据就会出问题。
内容的提问来源于stack exchange,提问作者M.wol
相关产品推荐
相关产品推荐

