【问题标题】:Getting rid of keys in nested dictionary that contain None values摆脱嵌套字典中包含 None 值的键
【发布时间】:2018-06-17 12:42:48
【问题描述】:

我有以下字典:

dict_2 = {
    'key1': {'subkey1': 2, 'subkey2': 7, 'subkey3': 5},
    'key2': {'subkey1': None, 'subkey2': None, 'subkey3': None},
}

我期待通过删除带有嵌套字典的整个键来清除 None 中的 None 值中的 dict_2:

简而言之,我的输出应该是:

dict_2={key1:{subkey1:2,subkey2:7,subkey3:5}}

我尝试的是:

glob_dict={}

for k,v in dict_2.items():
    dictionary={k: dict_2[k] for k in dict_2 if not None (dict_2[k]
['subkey2'])}
    if bool(glob_dict)==False:
        glob_dict=dictionary
    else:
        glob_dict={**glob_dict,**dictionary}

print(glob_dict)

我目前的输出是:

TypeError: 'NoneType' object is not callable

我不确定循环是否是摆脱嵌套循环的None 值的最佳方法,我也不确定如何表达我想摆脱None价值观。

【问题讨论】:

  • @IMCoins 感谢您的回复,但是更改后它继续输出相同的错误,我猜它与:dictionary={k: dict_2[k] for k in dict_2 if not None (dict_2[k] ['subkey2'])}
  • 你想删除所有为None的子键,并删除没有剩余子键的键?
  • 我假设dict_2={key1:{subkey1:None,subkey2:7,subkey3:5},key2:{subkey1:4,subkey2:None,subkey3:None}} 应该导致dict_2={key1:{subkey2:7,subkey3:5},key2:{subkey1:4}}?所以只有没有任何子键的键被删除?

标签: python dictionary nested


【解决方案1】:

删除所有None 和后续空字典的递归解决方案可以如下所示:

代码:

def remove_empties_from_dict(a_dict):
    new_dict = {}
    for k, v in a_dict.items():
        if isinstance(v, dict):
            v = remove_empties_from_dict(v)
        if v is not None:
            new_dict[k] = v
    return new_dict or None

测试代码:

dict_2 = {
    'key1': {'subkey1': 2, 'subkey2': 7, 'subkey3': 5},
    'key2': {'subkey1': None, 'subkey2': None, 'subkey3': None},
}
print(remove_empties_from_dict(dict_2))

结果:

{'key1': {'subkey1': 2, 'subkey2': 7, 'subkey3': 5}}

【讨论】:

  • remove_empties_from_dict({}) == None?
【解决方案2】:
dict_2={'key1':{'subkey1':2,'subkey2':7,'subkey3':5} ,'key2':{'subkey1':None,'subkey2':None,'subkey3':None}}

d = {}
for k, v in dict_2.iteritems():
    if any(v.values()):
        d[k] = v
print d

结果:

{'key1': {'subkey2': 7, 'subkey3': 5, 'subkey1': 2}}

【讨论】:

  • 在我的 Python 3 环境中:“AttributeError: 'dict' object has no attribute 'iteritems'”。在我的 Python 2 控制台中,它返回一个空字典,如果不是所有的 None 值都在同一个键下。
  • 为python2.7更新
  • 它仍然不会删除 None 子键,如果同一键部分中有另一个未设置为 None 的子键
  • @Mr.T python3 现在是 dict.items()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2020-08-04
相关资源
最近更新 更多