假设一个长度不等的字典列表,这是使它们长度相等的最佳方法,即缺少键值,添加键但值设置为空字符串或null:
lst = [
{'id': '123', 'name': 'john'},
{'id': '121', 'name': 'jane'},
{'id': '121'},
{'name': 'mary'}
]
成为:
lst = [
{'id': '123', 'name': 'john'},
{'id': '121', 'name': 'jane'},
{'id': '121', 'name': ''},
{'id': '', 'name': 'mary'}
]
我能想到的唯一方法是转换为pandas数据帧然后再转换为dict:
pd.DataFrame(lst).to_dict(orient='records')
答案 0 :(得分:4)
查找所有密钥需要完整的初始数据传递:
<ng-container *ngTemplateOutlet="header"></ng-container>
现在迭代dicts并为每个键设置默认值:
>>> set().union(*lst)
{'id', 'name'}
答案 1 :(得分:2)
您可以使用colleections.ChainMap
获取所有密钥:
>>> lst = [
... {'id': '123', 'name': 'john'},
... {'id': '121', 'name': 'jane'},
... {'id': '121'},
... {'name': 'mary'}
... ]
>>>
>>> from collections import ChainMap
>>>
>>> for k in ChainMap(*lst):
... for d in lst:
... _ = d.setdefault(k, '')
...
>>> lst
[{'id': '123', 'name': 'john'}, {'id': '121', 'name': 'jane'}, {'id': '121', 'name': ''}, {'name': 'mary', 'id': ''}]
答案 2 :(得分:1)
尝试使用此代码段
lst = [
{'id': '123', 'name': 'john'},
{'id': '121', 'name': 'jane'},
{'id': '121'},
{'name': 'mary'}
]
for data in lst:
if "name" not in data:
data["name"] = ""
if "id" not in data:
data["id"] = ""
print(lst)
答案 3 :(得分:0)
这是一种方式(Python 3.5 +)。
>>> all_keys = set(key for d in lst for key in d)
>>> [{**dict.fromkeys(all_keys, ''), **d} for d in lst]
[{'id': '123', 'name': 'john'}, {'id': '121', 'name': 'jane'}, {'id': '121', 'name': ''}, {'id': '', 'name': 'mary'}]
(请注意,解包顺序在这里至关重要,您必须在字典后面用默认值解包d
以覆盖默认值。)