如何交替合并两个字典的键值对以生成新字典
交替合并两个字典的实现方案
核心思路
Python 3.7及以上版本的字典是插入有序的,我们可以先将两个字典的键值对转换成可迭代序列,交替取出两组序列中的元素,最后合并成新字典;若其中一个字典元素更多,剩余元素直接追加到末尾即可。
基础实现代码
借助itertools.zip_longest处理长度不同的序列,它会自动为较短序列补None,我们只需过滤掉None的情况:
from itertools import zip_longest dict1 = {"zero":0,"two":2, "four":4, "six": 6, "eight":8,"ten":10} dict2 = {"one":1,"three":3,"five":5,"seven":7, "nine":9} dict3 = {} for pair1, pair2 in zip_longest(dict1.items(), dict2.items()): if pair1: dict3[pair1[0]] = pair1[1] if pair2: dict3[pair2[0]] = pair2[1] print(dict3)
运行结果:
{'zero': 0, 'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6, 'seven': 7, 'eight': 8, 'nine': 9, 'ten': 10}
兼容旧Python版本(3.6及以下)
3.7之前的普通字典是无序的,需用collections.OrderedDict保证顺序:
from itertools import zip_longest from collections import OrderedDict dict1 = OrderedDict({"zero":0,"two":2, "four":4, "six": 6, "eight":8,"ten":10}) dict2 = OrderedDict({"one":1,"three":3,"five":5,"seven":7, "nine":9}) dict3 = OrderedDict() for pair1, pair2 in zip_longest(dict1.items(), dict2.items()): if pair1: dict3[pair1[0]] = pair1[1] if pair2: dict3[pair2[0]] = pair2[1] # 按需转换成普通字典 print(dict(dict3))
简化写法(Python 3.9+)
利用生成器表达式构建键值对序列,一行完成合并:
from itertools import zip_longest dict1 = {"zero":0,"two":2, "four":4, "six": 6, "eight":8,"ten":10} dict2 = {"one":1,"three":3,"five":5,"seven":7, "nine":9} dict3 = dict( item for pairs in zip_longest(dict1.items(), dict2.items()) for item in pairs if item is not None )
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

