如何将嵌套字典转换为 Python 元组?

Posted

技术标签:

【中文标题】如何将嵌套字典转换为 Python 元组?【英文标题】:How to convert nested dictionaries into Python tuples? 【发布时间】:2021-06-14 15:17:21 【问题描述】:

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

这个想法是像这样创建一个多索引数据框:

pd.DataFrame(tuple)

        default             expert
        value   quantity    value   quantity
USD     490.0   490.0       500.0   500.0

我做了什么

使用 (see this question) 可以获得稍微不同的结果:

(outerKey, innerKey): values for outerKey, innerDict in d.items() 
 for innerKey, values in innerDict.items()

这给出了:

('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

【问题讨论】:

【参考方案1】:

你可以像这样使用 smth,它看起来很丰富,但效果和预期的一样:

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

【讨论】:

【参考方案2】:

一般来说,我会将初始 dict 展平,将其加载到 DataFrame 中,然后旋转 DataFrame:

# 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

并且痕迹是(未注释时):

[('default', 'USD', 'value', 490.0), ('default', 'USD', 'quantity', 490.0),
 ('expert', 'USD', 'value', 500.0), ('expert', 'USD', 'quantity', 500.0)]

         0    1         2      3
0  default  USD     value  490.0
1  default  USD  quantity  490.0
2   expert  USD     value  500.0
3   expert  USD  quantity  500.0

【讨论】:

由于某种原因,pivot 函数返回IndexError: Too many levels: Index has only 2 levels, not 3。这是我的跟踪[('default', 'USD', 'value', 490.0), ('default', 'USD', 'quantity', 490.0), ('expert', 'USD', 'value', 500.0), ('expert', 'USD', 'quantity', 500.0)] 我忘了说这也是错误信息的一部分ValueError: 2 is not in list【参考方案3】:

我通过在问题中的示例中添加带有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

【讨论】:

我没有提供嵌套列表理解,因为听说它不是推荐,因为阅读复杂

以上是关于如何将嵌套字典转换为 Python 元组?的主要内容,如果未能解决你的问题,请参考以下文章

将带有元组作为键的嵌套字典转换为数据框

如何将带有元组键的 python 字典转换为 pandas 多索引数据框?

Python将字典中的值转换为元组

将命名元组转换为字典

如何将字典转换为元组列表?

如何将字典、集合、元组列表的多列转换为列