如何将嵌套字典转换为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

我想将嵌套字典转换为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': 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不在列表中