You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 09:33:41