从具有嵌套结构的字典中删除混合数据类型的空值和空对象

AJG

在我问过的一个类似问题的背后,人们将如何清理包含各种数据类型的字典:空值、空列表、空字典等,在不同的嵌套级别例如

{
  "key":"value",
  "key1": {},
  "key2": [],
  "key3": True,
  "key4": False,
  "key5": None,
  "key6": [1,2,3],
  "key7": {
    "subkey": "subvalue"
  },
  "key8": {
    "subdict": {
      "subdictkey": "subdictvalue", 
      "subdictkey1": {},
      "subdictkey2": [],
      "subdictkey3": None
    }
  }
}

变成:

{
  "key":"value",
  "key3": True,
  "key4": False,
  "key6": [1,2,3],
  "key7": {
    "subkey": "subvalue"
  },
  "key8": {
    "subdict": {
      "subdictkey": "subdictvalue"
    }
  }
}

该解决方案应该适用于 n 级嵌套(不仅仅是 1 级)。显然,我想避免嵌套循环(尤其是 n 可能等于 3 或 4),是使结构展平的唯一解决方案吗?有没有更优雅的方式来解决它?

编辑:以@Ch3steR 答案为基础,并考虑到我在包含空值的列表中遇到的问题,这是最终的工作功能:

def recur(n_dict,new_d={}):
    global counter
    for key,val in n_dict.items():
        if val or isinstance(val,bool) or (isinstance(val,list) and any(elem is not None for elem in val)):
                if (isinstance(val,list) and any(elem is None for elem in val)):
                   counter=counter+1
                else:
                    new_d={**new_d,**{key:val}}
                    if isinstance(val,dict):
                        new_d[key]=recur(val)

    return new_d
Ch3ster

当您处理任意嵌套的字典时,您可以使用递归

试试这个。

def recur(n_dict,new_d={}):
    for key,val in n_dict.items():
        if val or isinstance(val,bool):
            new_d={**new_d,**{key:val}}
            if isinstance(val,dict):
                new_d[key]=recur(val)
    return new_d

a={
  "key":"value",
  "key1": {},
  "key2": [],
  "key3": True,
  "key4": False,
  "key5": None,
  "key6": [1,2,3],
  "key7": {
    "subkey": "subvalue"
  },
  "key8": {
    "subdict": {
      "subdictkey": "subdictvalue", 
      "subdictkey1": {},
      "subdictkey2": [],
      "subdictkey3": None
    }
  }
}

print(recur(a))
{'key': 'value',
 'key3': True,
 'key4': False,
 'key6': [1, 2, 3],
 'key7': {'subkey': 'subvalue'},
 'key8': {'subdict': {'subdictkey': 'subdictvalue'}}}

recur(n_dict,new_d={}) 使用可变的默认参数。

笔记:

永远不要new_d就地变异,否则你会遇到这个问题。

检查默认参数是否已更改的一种方法是使用__defaults__

>>>recur(a)
>>>recur.__defaults__
({},) 
>>>recur(a)
>>>recur.__defaults__
({},) 

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从字典中删除混合数据类型的空对象和空对象

来自分类Dev

删除具有混合数据类型的值

来自分类Dev

如何对具有混合数据类型和数据结构的列表进行子集设置?

来自分类Dev

删除pandas数据框中具有混合数据类型的所有行,这些数据类型包含多列中的特定字符串

来自分类Dev

具有混合数据类型的列的 groupby 数据

来自分类Dev

在R中:具有混合数据类型的数据帧的类型转换

来自分类Dev

混合数据类型,函数和对象

来自分类Dev

具有混合数据类型的列表的Numpy dtype

来自分类Dev

CSV 过滤具有混合数据类型的列

来自分类Dev

从数组创建具有混合数据类型的表

来自分类Dev

C#中具有混合数据类型的数组

来自分类Dev

在Swagger中定义具有混合数据类型的属性

来自分类Dev

Power-Query中具有混合数据类型的“自定义”列

来自分类Dev

查找支持列表和集合以及整数和 str 的混合数据类型的空单元格

来自分类Dev

如何将Pandas数据框旋转为具有混合数据类型和可能的双重值的新格式

来自分类Dev

C ++中具有匿名类型的嵌套结构

来自分类Dev

仅在python中具有空值的列的数据类型

来自分类Dev

从嵌套对象(ES6)中删除空值和空值-清除嵌套对象

来自分类Dev

Ramda:删除嵌套结构中的对象

来自分类Dev

在python中读取具有混合数据类型的未知大小的二进制文件

来自分类Dev

具有混合数据类型的TensorFlow数据集生成器

来自分类Dev

为所有具有值和标签属性的嵌套结构定义自定义类型

来自分类Dev

具有混合对象类型的嵌套XAML Treeview结构

来自分类Dev

转换具有单个混合数据类型数组的单个字符串

来自分类Dev

使用Boost.Spirit解析具有混合数据类型的OBJ文件?

来自分类Dev

如何为视图中的列分配空值,使其具有 DATE 类型的数据类型?

来自分类Dev

在Python中从具有混合结构(列表和整数)的嵌套列表中删除元素

来自分类Dev

在熊猫列中组合混合数据类型

来自分类Dev

在ByteBuffer中写入混合数据类型

Related 相关文章

  1. 1

    从字典中删除混合数据类型的空对象和空对象

  2. 2

    删除具有混合数据类型的值

  3. 3

    如何对具有混合数据类型和数据结构的列表进行子集设置?

  4. 4

    删除pandas数据框中具有混合数据类型的所有行,这些数据类型包含多列中的特定字符串

  5. 5

    具有混合数据类型的列的 groupby 数据

  6. 6

    在R中:具有混合数据类型的数据帧的类型转换

  7. 7

    混合数据类型,函数和对象

  8. 8

    具有混合数据类型的列表的Numpy dtype

  9. 9

    CSV 过滤具有混合数据类型的列

  10. 10

    从数组创建具有混合数据类型的表

  11. 11

    C#中具有混合数据类型的数组

  12. 12

    在Swagger中定义具有混合数据类型的属性

  13. 13

    Power-Query中具有混合数据类型的“自定义”列

  14. 14

    查找支持列表和集合以及整数和 str 的混合数据类型的空单元格

  15. 15

    如何将Pandas数据框旋转为具有混合数据类型和可能的双重值的新格式

  16. 16

    C ++中具有匿名类型的嵌套结构

  17. 17

    仅在python中具有空值的列的数据类型

  18. 18

    从嵌套对象(ES6)中删除空值和空值-清除嵌套对象

  19. 19

    Ramda:删除嵌套结构中的对象

  20. 20

    在python中读取具有混合数据类型的未知大小的二进制文件

  21. 21

    具有混合数据类型的TensorFlow数据集生成器

  22. 22

    为所有具有值和标签属性的嵌套结构定义自定义类型

  23. 23

    具有混合对象类型的嵌套XAML Treeview结构

  24. 24

    转换具有单个混合数据类型数组的单个字符串

  25. 25

    使用Boost.Spirit解析具有混合数据类型的OBJ文件?

  26. 26

    如何为视图中的列分配空值,使其具有 DATE 类型的数据类型?

  27. 27

    在Python中从具有混合结构(列表和整数)的嵌套列表中删除元素

  28. 28

    在熊猫列中组合混合数据类型

  29. 29

    在ByteBuffer中写入混合数据类型

热门标签

归档