Python如何合并两个字典使对应键值组成列表的列表嵌套结构
Python字典按Key合并对应值为二维列表
问题复现
现有两个键完全对应的字典:
dd = {1: [10, 15], 5: [10, 20, 27], 3: [7]} dd1 = {1: [1, 4], 5: [2, 5, 6], 3: [3]}
目标是把两个字典同Key的列表整合成平级的二维列表,最终得到:
dd = {1: [[10, 15],[1, 4]], 5: [[10, 20, 27],[2, 5, 6]], 3: [[7],[3]]}
之前尝试的写法无法得到正确结果:
for dictionary in (dd, dd1): for key, value in dictionary.items(): dd[key].append([value])
该写法的问题是直接在原dd的列表上做追加操作,还会先遍历dd自身把原有值嵌套塞回列表,最终得到的是多层嵌套的混乱结构,不是两个原列表平级组成二维列表的效果。
最简实现
两个字典键完全对齐的场景下,用字典推导式一行就能搞定:
dd = {k: [origin_val, dd1[k]] for k, origin_val in dd.items()}
执行后dd的结构和预期完全一致。
如果需要兼容两个字典键不完全匹配的场景(存在某个键只在单个字典中出现),可以先取所有键的并集,缺失值默认补空列表:
# 取两个字典所有键的并集 common_keys = dd.keys() | dd1.keys() dd = {k: [dd.get(k, []), dd1.get(k, [])] for k in common_keys}
原代码错误说明
原写法的执行逻辑完全不符合预期,核心问题有两个:
- 遍历的元组第一个元素就是原
dd本身,第一轮循环就会把dd自身的value包一层列表追加到原列表里,直接破坏原始数据,比如key=1的列表会从[10,15]变成[10,15, [[10,15]]] - 第二轮遍历
dd1时,又会把dd1的value包一层列表追加到已经被破坏的原列表末尾,最终得到的是三层嵌套的混乱结构,不可能得到两个原列表平级的效果。
内容的提问来源于stack exchange,提问作者rweber
相关产品推荐
相关产品推荐

