2015-11-04 167 views
0

我试图从嵌套的词典中删除非数值删除嵌套的字典空类型的字典。我的第一个努力工作正常,但不幸的是指向现在空类型的字典键仍然存在。与递归函数

所以,如果我做的:

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 

编辑:

失败例如,下面的回报字典为{'foo': 'bar', 'bar': None}

{ 
    'foo': 'bar', 
    'bar': { 
     'foo': None, 
     'one': None 
    } 
} 
+2

不经常传递my_dict到脱衣舞娘......那不结束以及 –

+0

可以哟你发布一个非常简单的例子,这不起作用?如果它的叶子在第一轮空类型的字典,那么它很可能是后续行程可以留下,以及... – mgilson

+0

曾做过空值的键,感谢 – rix

回答

1

的字典理解肯定是简洁的,但如果你将其展开时,该解决方案变得更加明显:

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 
+0

失踪的'{}'的'不是V(“” ,None,{})'line - 我没有测试过它。补充说,看来我的工作。任何人下投票,再看看,因为我相信这样做的伎俩。 –