使字典列表中的字典长度相等

时间:2018-05-25 19:23:40

标签: python

假设一个长度不等的字典列表,这是使它们长度相等的最佳方法,即缺少键值,添加键但值设置为空字符串或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')

4 个答案:

答案 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以覆盖默认值。)