如何为列表中的字典补充缺失键以适配matplotlib绘图?
解决字典列表补充缺失键并设默认值的问题
嘿,这个需求我之前处理过好几次,尤其是做数据绘图的时候,必须保证每个字典的键都一致才行!给你几个实用的实现方法,按需选就行:
方法一:基础循环实现(兼容所有Python版本)
先把所有字典里出现过的键收集全,再逐个给每个字典补全缺失的键,默认值设为0:
original_list = [ { "foo":1, "bar":2 }, { "foo":8, "baz":3 } ] # 第一步:收集所有唯一的键 all_keys = set() for d in original_list: all_keys.update(d.keys()) all_keys = list(all_keys) # 第二步:补全每个字典的键 result = [] for d in original_list: # 对每个键,存在就取原值,不存在用0填充 new_dict = {key: d.get(key, 0) for key in all_keys} result.append(new_dict) print(result) # 输出结果: # [{'foo': 1, 'bar': 2, 'baz': 0}, {'foo': 8, 'bar': 0, 'baz': 3}]
这个方法逻辑直白,不管你用哪个Python版本都能跑,新手也很容易理解整个流程。
方法二:简洁写法(Python 3.9+)
如果你的Python版本是3.9及以上,可以用字典合并运算符|来简化代码,几行就能搞定:
original_list = [ { "foo":1, "bar":2 }, { "foo":8, "baz":3 } ] # 用集合推导式快速收集所有键 all_keys = {k for d in original_list for k in d.keys()} # 先生成全键默认0的字典,再用原字典覆盖已有键的数值 result = [dict.fromkeys(all_keys, 0) | d for d in original_list] print(result)
要是你用的是Python 3.8及以下版本,换成字典解包的写法也能实现同样效果:
# Python 3.8及以下兼容写法 result = [{**dict.fromkeys(all_keys, 0), **d} for d in original_list]
方法三:保持键的顺序(可选)
如果希望补全后的字典键是有序的(比如绘图时图例顺序统一),可以把收集到的键排序后再处理:
original_list = [ { "foo":1, "bar":2 }, { "foo":8, "baz":3 } ] all_keys = sorted({k for d in original_list for k in d.keys()}) result = [{key: d.get(key, 0) for key in all_keys} for d in original_list] print(result) # 输出结果(键按字母排序): # [{'bar': 2, 'baz': 0, 'foo': 1}, {'bar': 0, 'baz': 3, 'foo': 8}]
这样处理后,每个字典的键顺序完全一致,后续用matplotlib绘图时就不会出现数据列错位的问题啦~
内容的提问来源于stack exchange,提问作者Dyspro
相关产品推荐
相关产品推荐

