【问题标题】:How to remove top levels in a nested dictionary structure in Python如何在 Python 中删除嵌套字典结构中的顶层
【发布时间】:2021-12-08 12:15:46
【问题描述】:

我有一个嵌套字典,如下所示,

{
 'product_list.show_date': "May '21",
  'product_list.new_users': 
   {
    'product_list.product': 
     {
      'A': None,
      'B': 377,
      'C': None,
      'D': 67,
      'E': None,
      'F': 1,
      'G': None
     }
    }
}

我想以不存在父键的方式清除它。所以基本上,我想要一个没有嵌套的字典。如下所示,

{
 'product_list.show_date': "May '21",
 'A': None,
 'B': 377,
 'C': None,
 'D': 67,
 'E': None,
 'F': 1,
 'G': None
}

我正在使用递归函数来执行此操作,但它不是 100% 正确的。

这是我的代码,

def clear_nd(d, nested_dict):
    for key in nested_dict:
        if type(nested_dict[key]) != dict:
            d[key] = nested_dict[key]
        elif type(nested_dict[key]) == dict:
            nested_dict = nested_dict[key]
            clear_nd(d, nested_dict)
    
    return d

d = {}
clear_nd(d, nested_dict)

下面的例子,

nested_dict = {
    'product_list.show_date': "May '21",
    'product_list.new_users': {
        'product_list.product': {
            'A': None,
            'B': 377,
            'C': None,
            'D': 67,
            'E': None,
            'F': 1,
            'G': None
        },
        'prod.product': {
            'Alk': None,
            'Bay': 377,
            'Lent': None,
            'R': 67,
            'Ter': None,
            'Wi': 1,
            'e': None
        }
    },
    'duct_list.new_users': {
        'pdust.product': {
            'H': None,
            'y': 377,
            'nt': None,
            'C': 67,
            'sfer': None,
            's': 1,
            'le': None
        }
    }
}

Pandas 或任何其他库是否有办法做到这一点。 嵌套字典的结构是动态的,所以我们不知道它有多深。并且键也会改变,所以我们无法事先知道字典中的键是什么。我们将不胜感激。谢谢!!

【问题讨论】:

标签: python pandas algorithm dataframe dictionary


【解决方案1】:

如果您允许较低级别的标签标签采用较高级别标签标签的前缀,您可以使用 Pandas 函数 pandas.json_normalize,它处理嵌套的 dict 并将其转换为平面表 Pandas 数据框。

然后,使用pandas.DataFrame.to_dict 将 Pandas 数据框转换为字典。例如,

import pandas as pd

d = {
 'product_list.show_date': "May '21",
  'product_list.new_users': 
   {
    'product_list.product': 
     {
      'A': None,
      'B': 377,
      'C': None,
      'D': 67,
      'E': None,
      'F': 1,
      'G': None
     }
    }
}


pd.json_normalize(d).to_dict('records')[0]

结果:

{'product_list.show_date': "May '21",
 'product_list.new_users.product_list.product.A': None,
 'product_list.new_users.product_list.product.B': 377,
 'product_list.new_users.product_list.product.C': None,
 'product_list.new_users.product_list.product.D': 67,
 'product_list.new_users.product_list.product.E': None,
 'product_list.new_users.product_list.product.F': 1,
 'product_list.new_users.product_list.product.G': None}

【讨论】:

  • 谢谢,@SeaBean。这对我帮助很大!
  • @terraCoder 欢迎!乐于助人! :-)
  • @terraCoder 您的递归方法也是个好主意!但是,递归调用本质上很慢。如果数据集大小变大,您可能会遇到问题。一个主要的并发症是您的嵌套字典也是动态的!因此,依靠 Pandas 等知名包的功能可能是解决该问题的最佳方法之一。
  • @terraCoder 使用 Pandas 函数,您还可以利用其内置功能,例如控制最大级别数(字典深度)以进行规范化。
  • 嗨@SeaBean,我采用了内置方法,对于像你说的和干净的大型数据集来说,它要快得多。非常感谢!!
猜你喜欢
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 2019-11-18
  • 2020-10-20
  • 1970-01-01
相关资源
最近更新 更多