如何将嵌套字典转换为Python元组?
我想将嵌套字典转换为Python元组,但我发现的所有示例都不适合我的情况。这是字典的样子:如何将嵌套字典转换为Python元组?,python,Python,我想将嵌套字典转换为Python元组,但我发现的所有示例都不适合我的情况。这是字典的样子: d = {'default': {'USD': {'value': 490.0, 'quantity': 490.0}}, 'expert': {'USD': {'value': 500.0, 'quantity': 500.0}}} 预期结果: {('default', 'value'): {'USD': 490.0}, ('default', 'quantity'): {'USD': 4
d = {'default': {'USD': {'value': 490.0, 'quantity': 490.0}},
'expert': {'USD': {'value': 500.0, 'quantity': 500.0}}}
预期结果:
{('default', 'value'): {'USD': 490.0},
('default', 'quantity'): {'USD': 490.0},
('expert', 'value'): {'USD': 500.0},
('expert', 'quantity'): {'USD': 500.0}
}
d = {'default': {'USD': {'value': 490.0, 'quantity': 490.0}},
'expert': {'USD': {'value': 500.0, 'quantity': 500.0}}}
new_d = {}
for key, value in d.items():
for key1, value1 in value.items():
for key2, value2 in value1.items():
new_d[(key, key2)] = {key1: value2}
其想法是创建一个多索引数据帧,如下所示:
pd.DataFrame(tuple)
default expert
value quantity value quantity
USD 490.0 490.0 500.0 500.0
我所做的
使用()可以获得稍微不同的结果:
其中:
{('default', 'USD'): {'value': 490.0, 'quantity': 490.0},
('expert', 'USD'): {'value': 500.0, 'quantity': 500.0}}
但正如您所看到的,数据帧没有所需的结构:
default expert
USD USD
value 490.0 500.0
quantity 490.0 500.0
您可以像这样使用smth,它看起来很丰满,但效果与预期的一样:
{('default', 'value'): {'USD': 490.0},
('default', 'quantity'): {'USD': 490.0},
('expert', 'value'): {'USD': 500.0},
('expert', 'quantity'): {'USD': 500.0}
}
d = {'default': {'USD': {'value': 490.0, 'quantity': 490.0}},
'expert': {'USD': {'value': 500.0, 'quantity': 500.0}}}
new_d = {}
for key, value in d.items():
for key1, value1 in value.items():
for key2, value2 in value1.items():
new_d[(key, key2)] = {key1: value2}
我通过在问题中的示例中添加一个带有
secInnerDict
的嵌套级别找到了我自己问题的答案:
{(outerKey, secinnerKey): {innerKey:secvalues} for outerKey, innerDict in total.items() for innerKey, secInnerDict in innerDict.items() for secinnerKey, secvalues in secInnerDict.items()}
返回:
{('default', 'value'): {'USD': 490.0},
('default', 'quantity'): {'USD': 490.0},
('expert', 'value'): {'USD': 500.0},
('expert', 'quantity'): {'USD': 500.0}}
一般来说,我会将初始dict展平,将其加载到数据帧中,然后旋转数据帧:
# flatten:
def flatten(val):
if isinstance(val, list):
return val
elif isinstance(val, dict):
return [(k, *v) for k, value in val.items()
for v in flatten(value)]
return ((val,),)
# print(flatten(d)) # uncomment for traces
# load into a raw DataFrame:
df = pd.DataFrame(flatten(d))
# print(df) # uncomment for traces
# We can now choose what should be the index, columns and values
df = df.pivot(1, [0,2], 3).rename_axis(index=None, columns=(None, None))
正如预期的那样:
default expert
value quantity value quantity
USD 490.0 490.0 500.0 500.0
并且跟踪是(未注释时):
我没有提供嵌套列表理解,因为听说它不推荐,因为阅读复杂。出于某种原因,pivot函数返回
索引器。错误:级别太多:索引只有2级,而不是3级。这是我的跟踪[('default',USD',value',490.0),('default',USD',quantity',490.0),('expert',USD',value',500.0),('expert',USD',quantity',500.0)]
我忘了提到这也是错误消息的一部分ValueError:2不在列表中