将Python嵌套字典转换为表或列表的列表(不含Pandas)



我需要转换一个嵌套字典,如:

log={
'hKtN': {
'edit_field': ['id','coord'],
'ids': {
'4A': {
'update_type': 'delete'
},
'1A': {
'update_type': '',
'update_detail': []
},
'2A': {
'update_type': 'edit',
'update_detail': ['0913','0914']
}
}
}
}

在list的list中:

table = [ ['hKtN',['id','coord'],'4A','delete',''],
['hKtN',['id','coord'],'1A','','']
['hKtN',['id','coord'],'2A','edit',['0913','0914']]
] 

我将从创建一个表,如:

logId  |   edit_field   |  ids  | update_type | update_detail
--------------------------------------------------------------
hKtN   | ['id','coord'] |  4A   |    delete   |
hKtN   | ['id','coord'] |  1A   |             |
hKtN   | ['id','coord'] |  2A   |     edit    |['0913','0914']

我不能使用熊猫。什么是最蛇蝎化的方法?

编辑@Ajax1234的代码工作得很好,但它非常复杂,需要使用Pandas来构建表。如果能帮助我,我会建立一个更简单的日志字典,如:

log2={
'logId': 'hKtN',
'edit_field': [
'id',
'coord'
],
'ids': {
'4A': {
'update_type': 'delete'
},
'1A': {
'update_type': '',
'update_detail': [
]
},
'2A': {
'update_type': 'edit',
'update_detail': [
'0913',
'0914'
]
}
}

}

您可以使用递归生成器函数:

import itertools as it
log = {'hKtN': {'edit_field': ['id', 'coord'], 'ids': {'4A': {'update_type': 'delete'}, '1A': {'update_type': '', 'update_detail': []}, '2A': {'update_type': 'edit', 'update_detail': ['0913', '0914']}}}}
def flatten(d, c = [], k = 'logId'):
a, b, m = [*c], [], []
for x, y in d.items():
if k in ['logId', 'ids']:
m.append((k, x))
if not isinstance(y, dict):
a.append((x, y))
else:
b.append((x, y))
if not b:
yield from ([a] if not m else [[*a, j] for j in m])
else:
yield from [i for (x, y), j in it.zip_longest(b, m) 
for i in flatten(y, c = a if j is None else [*a, j], k = x)]
tbl = [dict(i) for i in flatten(log)]
print(tbl)

输出:

[{'logId': 'hKtN', 'edit_field': ['id', 'coord'], 'ids': '4A', 'update_type': 'delete'}, {'logId': 'hKtN', 'edit_field': ['id', 'coord'], 'ids': '1A', 'update_type': '', 'update_detail': []}, {'logId': 'hKtN', 'edit_field': ['id', 'coord'], 'ids': '2A', 'update_type': 'edit', 'update_detail': ['0913', '0914']}]

我会这样开头:

import pandas as pd
df = pd.json_normalize(log)

这个更简单,可以完成这个工作。

相关内容

  • 没有找到相关文章

最新更新