我需要转换一个嵌套字典,如:
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)
这个更简单,可以完成这个工作。