У меня есть словарь, который выглядит примерно так:
d = {'Food': {'Fruit' : {'Apples' : {'Golden Del.' : ['Yellow'],
'Granny Smith' : ['Green'],
'Fuji' : ['Red'],
},
'Cherries' : ['Red'],
'Bananas' : ['Yellow'],
'Grapes' : {'Red Grapes' : ['Red'],
'Green Grapes' : ['Green'],
},
},
'Dessert': {'Baked Ds' : {'Cakes' : {'Yellow Cake' : ['Yellow'],
'Red Velvet' : ['Red'],
},
'Cookies' : ['Yellow'],
},
},
'Steak' : ['Red'],
},
'Other': ['Blue'],
}
Таким образом, в основном это вложенный словарь n -, где каждое значение является либо другим словарем, либо списком, содержащим один элемент.
Допустим, я хочу отфильтровать это по одному элементу списка, скажем, «Красный», чтобы результат был:
d = {'Food': {'Fruit' : {'Apples' : {'Fuji' : ['Red'],
},
'Cherries' : ['Red'],
'Grapes' : {'Red Grapes' : ['Red'],
},
},
'Dessert': {'Baked Ds' : {'Cakes' : {'Red Velvet' : ['Red'],
},
},
},
'Steak' : ['Red'],
},
}
Таким образом, структура остается прежней, но все, что не имеет «красного» в качестве элемента списка, удаляется на всем пути вверх по иерархии.
Какие-либо предложения? Я некоторое время возился с этим и придумал это, но, похоже, это не работает:
def filterNestedDict(node, searchItem):
if isinstance(node,list):
return node
else:
for key, value in node.iteritems():
if isinstance(value,dict) and value is not {}:
return {key: filterNestedDict(value,searchItem)}
elif searchItem in value:
return {key: filterNestedDict(value,searchItem)}
return filterNestedDict(bigTree, searchItem)
Я подозреваю, что это просто проблема рекурсии, но любые предложения будут очень признательны.
Спасибо!