如何合并两个字典列表并忽略其中的None元素?
合并两个列表中的字典并忽略None元素
问题描述
现有两个包含字典和None的列表:
a = [{'a1': 1, 'a2': 2}, {'a3': 3}] b = [{'b1': 1, 'b2': 2}, None]
需要将两个列表对应位置的元素合并成一个字典,同时忽略其中的None值,最终得到如下结果:
desired_output = [{'a1': 1, 'a2': 2, 'b1': 1, 'b2': 2}, {'a3': 3}]
解决方案
方法1:基础循环实现
逻辑清晰,适合新手理解:
a = [{'a1': 1, 'a2': 2}, {'a3': 3}] b = [{'b1': 1, 'b2': 2}, None] desired_output = [] for x, y in zip(a, b): merged_dict = {} # 若当前位置a的元素非None,合并到结果字典 if x is not None: merged_dict.update(x) # 若当前位置b的元素非None,合并到结果字典 if y is not None: merged_dict.update(y) # 避免添加空字典(当x和y均为None时) if merged_dict: desired_output.append(merged_dict) print(desired_output)
方法2:列表推导式简化
利用Python字典解包语法和逻辑判断,简化代码:
a = [{'a1': 1, 'a2': 2}, {'a3': 3}] b = [{'b1': 1, 'b2': 2}, None] desired_output = [ {**(x or {}), **(y or {})} for x, y in zip(a, b) if x or y # 跳过两个元素均为None的情况 ] print(desired_output)
说明:
x or {}:若x是None则返回空字典,避免解包None报错{**dict1, **dict2}:将两个字典合并为一个(Python 3.5+支持)if x or y:确保仅当至少一个元素非空时才添加到结果列表
方法3:处理长度不一致的列表
如果两个列表长度不同,想要保留所有元素,可使用itertools.zip_longest:
from itertools import zip_longest a = [{'a1': 1, 'a2': 2}, {'a3': 3}, {'a4': 4}] b = [{'b1': 1, 'b2': 2}, None] desired_output = [ {**(x or {}), **(y or {})} for x, y in zip_longest(a, b, fillvalue=None) if x or y ] print(desired_output) # 输出: [{'a1': 1, 'a2': 2, 'b1': 1, 'b2': 2}, {'a3': 3}, {'a4': 4}]
内容的提问来源于stack exchange,提问作者Javi Torre
相关产品推荐
相关产品推荐

