Python 使用递归函数删除嵌套字典中的空dict

Python 使用递归函数删除嵌套字典中的空dict,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我正在尝试从嵌套字典中删除非值。我的第一次努力很好,但不幸的是指向现在空的dict的键仍然存在 因此,如果我这样做: pass1 = stripper(my_dict) return stripper(pass1) 这是可行的,但我认为一个更优雅的嵌套解决方案是可能的 def stripper(self, data): if isinstance(data, dict): d = ({k: stripper(v) for k, v in data.items()

我正在尝试从嵌套字典中删除非值。我的第一次努力很好,但不幸的是指向现在空的dict的键仍然存在

因此,如果我这样做:

pass1 = stripper(my_dict)
return stripper(pass1)
这是可行的,但我认为一个更优雅的嵌套解决方案是可能的

def stripper(self, data):
    if isinstance(data, dict):
        d = ({k: stripper(v) for k, v in data.items()
             if v not in [u'', None]})
        if d:
            return d
    else:
        return data
编辑:

失败的示例,下面的dict返回为{'foo':'bar','bar':None}:


口述理解当然是简明扼要的,但如果你把它展开,解决方案就会变得更加明显:

def stripper(self, data):
    new_data = {}
    for k, v in data.items():
        if isinstance(v, dict):
            v = stripper(v)
        if not v in (u'', None, {}):
            new_data[k] = v
    return new_data

口述理解当然是简明扼要的,但如果你把它展开,解决方案就会变得更加明显:

def stripper(self, data):
    new_data = {}
    for k, v in data.items():
        if isinstance(v, dict):
            v = stripper(v)
        if not v in (u'', None, {}):
            new_data[k] = v
    return new_data

要扩展接受的答案以包括可能是列表元素的对象,请执行以下操作:

def strip_empties_from_list(data):
    new_data = []
    for v in data:
        if isinstance(v, dict):
            v = strip_empties_from_dict(v)
        elif isinstance(v, list):
            v = strip_empties_from_list(v)
        if v not in (None, str(), list(), dict(),):
            new_data.append(v)
    return new_data


def strip_empties_from_dict(data):
    new_data = {}
    for k, v in data.items():
        if isinstance(v, dict):
            v = strip_empties_from_dict(v)
        elif isinstance(v, list):
            v = strip_empties_from_list(v)
        if v not in (None, str(), list(), dict(),):
            new_data[k] = v
    return new_data
使用:

data = {
  'None': None,
  'empty_list': [],
  'empty_dict': {},
  'empty_string': '',
  'list_with_empties': ['', {}, [], None, {'more_empties': '', 'and_even_more': [''], 'one_thing_i_care_about': 'hi'}]
}
stripped_data = strip_empties_from_dict(data)
print(stripped_data)

要扩展接受的答案以包括可能是列表元素的对象,请执行以下操作:

def strip_empties_from_list(data):
    new_data = []
    for v in data:
        if isinstance(v, dict):
            v = strip_empties_from_dict(v)
        elif isinstance(v, list):
            v = strip_empties_from_list(v)
        if v not in (None, str(), list(), dict(),):
            new_data.append(v)
    return new_data


def strip_empties_from_dict(data):
    new_data = {}
    for k, v in data.items():
        if isinstance(v, dict):
            v = strip_empties_from_dict(v)
        elif isinstance(v, list):
            v = strip_empties_from_list(v)
        if v not in (None, str(), list(), dict(),):
            new_data[k] = v
    return new_data
使用:

data = {
  'None': None,
  'empty_list': [],
  'empty_dict': {},
  'empty_string': '',
  'list_with_empties': ['', {}, [], None, {'more_empties': '', 'and_even_more': [''], 'one_thing_i_care_about': 'hi'}]
}
stripped_data = strip_empties_from_dict(data)
print(stripped_data)

你通常不会把我的遗言传给脱衣舞女。。。这不是很好的结局。你能举一个很简单的例子说明这不起作用吗?如果它在第一次传递时留下空的dict,那么后续的传递可能也会留下带有空值的键…您通常不会将我的dict传递给剥离器。。。这不是很好的结局。你能举一个很简单的例子说明这不起作用吗?如果它在第一个过程中留下空的dict,那么后续的过程可能也会留下带有空值的键…在not v in,None,{}行中缺少{},我没有测试它。加上这一点,我觉得这是可行的。不管是谁投了反对票,再看一眼,因为我相信这会起到作用。在非v-in,None,{}行中遗漏了{},我没有测试它。加上这一点,我觉得这是可行的。无论谁投了反对票,请再看一眼,因为我相信这会奏效。