Python 3.10如何合并两个等长字典列表为对应键值组合的新列表
等长字典列表按位置合并实现方案
你的运行环境为Python v3.10.4,需求是将两个长度一致的字典列表,按索引位置将对应下标的两个字典合并为单个字典,最终组成新的IOC汇总列表。
推荐实现(适配Python 3.10环境)
Python 3.9及以上版本原生支持字典|运算符合并键值对,直接用zip()配对两个列表的同位置元素即可一行实现:
uniq = [ {'uniq-name': '2022-06-26 14:21:25.298167'}, {'uniq-name': '2022-06-26 14:21:25.298204'} ] iocvalue = [ {'value': '116.30.7.55'}, {'value': '31.215.70.187'} ] summary = [u | v for u, v in zip(uniq, iocvalue)]
运行得到的summary结构完全符合预期:
[ {'uniq-name': '2022-06-26 14:21:25.298167', 'value': '116.30.7.55'}, {'uniq-name': '2022-06-26 14:21:25.298204', 'value': '31.215.70.187'} ]
低版本兼容写法
如果后续需要在Python 3.9以下环境运行,可以用字典解包语法实现相同效果:
summary = [{**u, **v} for u, v in zip(uniq, iocvalue)]
之前尝试的写法错误原因
- 列表拼接写法
[{[val for val in uniq] + [ val for val in iocvalue]}]:只是把两个列表的所有字典元素简单拼接成一个新列表,没有做同位置配对;同时外层用{}包裹列表试图创建集合,但字典是不可哈希类型,无法存入集合,会直接抛出类型错误。 - 直接解包列表的
**uniq、**iocvalue写法:解包语法要求操作对象是存储键值对的字典类型,直接对列表使用解包会触发类型错误,无法运行。
注意:
zip()默认会在两个列表长度不一致时,以更短的列表长度为界截断数据。如果你的业务场景要求两个列表必须严格等长避免数据遗漏,可以在执行合并前加长度校验,或者使用itertools.zip_longest补全缺失位置的键值。
内容的提问来源于stack exchange,提问作者linuxguy
相关产品推荐
相关产品推荐

