2016-02-25 90 views
0

我想过滤嵌套字典一定水平,例如:如何过滤某个嵌套级别的嵌套字典?

d = {'fruit': {'sweet': {'green': 'apple', 'red': 'tomato'}, 'bitter': {'green': 'cucumber'}}} 

我想写一个函数filter_at_level(d, 2, lambda r: r == 'green'),这将只返回以下而不修改原始数据:

{'fruit': {'sweet': {'green': 'apple'}, 'bitter': {'green': 'cucumber'}}} 

我应该避免递归吗?它可以有效地写入而无需递归?

+0

你尝试过这么远吗?它不工作还是很慢?你能澄清一下这个问题吗?只有在级别为'n'的字典包含'target'字符串时,您是否想要返回顶级元素? –

回答

1
from itertools import ifilter 

def f(d, func, l): 
    if l == 0: 
     return {k: d[k] for k in ifilter(func, d)} 
    return {k: f(v, func, l - 1) for k, v in d.iteritems()} 

d = {'fruit': {'sweet': {'green': 'apple', 'red': 'tomato'}, 'bitter': {'green': 'cucumber'}}} 

print f(d, lambda k: k == 'green', 2) 

,或者如果你不希望空元素:

from itertools import ifilter 

def f(d, func, l): 
    if l == 0: 
     return {k: d[k] for k in ifilter(func, d)} 
    tmp = {k: f(v, func, l - 1) for k, v in d.iteritems()} 
    return {k: v for k, v in tmp.iteritems() if v} 

d = {'fruit': {'sweet': {'green': 'apple', 'red': 'tomato'}, 'bitter': {'green': 'cucumber'}, 'x': {'a': 'z'}}} 

print f(d, lambda k: k == 'green', 2)