Python:如何根据叶值过滤n嵌套的dict?
我有一个口述,看起来像这样:Python:如何根据叶值过滤n嵌套的dict?,python,dictionary,nested,Python,Dictionary,Nested,我有一个口述,看起来像这样: d = {'Food': {'Fruit' : {'Apples' : {'Golden Del.' : ['Yellow'], 'Granny Smith' : ['Green'], 'Fuji' : ['Red'],
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嵌套的dict,其中每个值要么是另一个dict,要么是一个包含单个项的列表
假设我想通过单个列表项来过滤它,比如说“红色”,这样结果将是:
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)
我怀疑这只是一个递归问题,但任何建议都将不胜感激
谢谢 你已经很接近了,这应该对你有好处:
def filter_nested_dict(node, search_term):
if isinstance(node, list):
if node[0] == search_term:
return node
else:
return None
else:
dupe_node = {}
for key, val in node.iteritems():
cur_node = filter_nested_dict(val, search_term)
if cur_node:
dupe_node[key] = cur_node
return dupe_node or None
叶子是单值列表而不仅仅是字符串,这有什么原因吗?wx.TreeListCtrl就是原因。那些字典定义看起来不错+1挑剔:答案中不需要包含字典。谢谢!这太完美了。
from collections import Mapping
def yield_values_2(d):
for key in d.keys():
if isinstance(d[key], Mapping):
yield_values_2(d[key])
if not d[key]:
del d[key]
elif d[key] != ["Red"]:
del d[key]
d = {'Food': {'Fruit' : {'Apples' : {'Fuji' : ['Red'], 'Fuji2': ['Blue']
},
'Cherries' : ['Red'],
'Grapes' : {'Red Grapes' : ['Red'],
},
},
'Dessert': {'Baked Ds' : {'Cakes' : {'Red Velvet' : ['Red'],
},
},
},
'Steak' : ['Red'],
},
}
print d
yield_values_2(d)
print d