Python合并两个字典列表时如何为缺失字段补0?
代码修改方案
你只需要调整defaultdict的默认生成逻辑,提前为每个月份的字典初始化所有需要的字段默认值为0即可,完整可运行代码如下:
from collections import defaultdict a = [{'Month': 'Sep 2021', 'Like': 6}, {'Month': 'Oct 2021', 'Like': 7}] b = [{'Month': 'Aug 2021', 'View': 20}, {'Month': 'Oct 2021', 'View': 8}] # 固定字段场景直接写死即可 d = defaultdict(lambda: {'Like':0, 'View':0}) for lst in (a, b): for item in lst: d[item['Month']]['Month'] = item['Month'] d[item['Month']].update(item) # 转成列表并按月份先后顺序排序 c = sorted(d.values(), key=lambda x: x['Month']) print(c)
运行后输出结果和你期望的完全一致:
[{'Like': 0, 'View': 20, 'Month': 'Aug 2021'}, {'Like': 6, 'View': 0, 'Month': 'Sep 2021'}, {'Like': 7, 'View': 8, 'Month': 'Oct 2021'}]
如果后续字段会动态增加,也可以自动收集所有非Month外的字段适配:
from collections import defaultdict a = [{'Month': 'Sep 2021', 'Like': 6}, {'Month': 'Oct 2021', 'Like': 7}] b = [{'Month': 'Aug 2021', 'View': 20}, {'Month': 'Oct 2021', 'View': 8}] # 动态收集所有需要补全的字段 required_fields = set() for lst in [a, b]: for item in lst: required_fields.update(item.keys()) required_fields.remove('Month') d = defaultdict(lambda: {field: 0 for field in required_fields}) for lst in [a, b]: for item in lst: d[item['Month']]['Month'] = item['Month'] d[item['Month']].update(item) c = sorted(d.values(), key=lambda x: x['Month'])
原代码问题说明
原代码中defaultdict(dict)生成的默认值是空字典,调用update方法只会追加存在的键值对,缺失的字段不会自动生成。修改后在初始化默认字典时提前把所有需要的字段默认设为0,后续update时存在的字段会覆盖默认的0,缺失的字段保留默认值即可实现自动补0的效果。
内容的提问来源于stack exchange,提问作者Percival test
相关产品推荐
相关产品推荐

