2016-02-25 94 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)