我有一个嵌套的字典,如下所示。
myDict= {
"id": 10,
"state": "MY LIST",
"Stars":
{
"BookA": {
"id": 10,
"state": "new book",
"Mystery": {
"AuthorA":
{
"id": "100",
"state": "thriller"
},
"AuthorB":
{
"id": "112",
"state": "horror"
}
},
"Thriller": {
"Store1":
{
"id": "300",
"state": "Old"
}
}
}
}
}
我想返回一个删除了所有“状态”:“文本”的字典。因此,我要删除所有“状态”字段并具有如下输出。 我希望它是通用方法,因为字典可以嵌套在多个级别上。
myDict=
{
id: 10,
"Stars":
{
"BookA": {
"id": 10
"Mystery": {
"AuthorA":
{
"id": "100"
},
"AuthorB":
{
"id": "112"
}
},
"Thriller": {
"Store1":
{
"id": "300"
}
}
}
}
我尝试了以下操作,但似乎不起作用。它仅删除“状态”:“我的列表”。有人可以帮我解决问题吗?
def get(self):
removelist= ["state"]
new_dict = {}
for key, item in myDict.items():
if key not in removelist:
new_dict.update({key: item})
return new_dict
它不会删除所有“状态”值。
答案 0 :(得分:2)
您可以使用DFS:
def remove_keys(d, keys):
if isinstance(d, dict):
return {k: remove_keys(v, keys) for k, v in d.items() if k not in keys}
else:
return d
这个想法是递归地从子树中删除键:对于每个嵌套的dict的子树,使用dict理解返回不删除键的dict;对于每个叶子(即单个值),只需返回该值即可。
测试:
from pprint import pprint
pprint(remove_keys(myDict, ['state']))
输出:
{'Stars': {'BookA': {'Mystery': {'AuthorA': {'id': '100'},
'AuthorB': {'id': '112'}},
'Thriller': {'Store1': {'id': '300'}},
'id': 10}},
'id': 10}
答案 1 :(得分:1)
问题是您没有处理嵌套字典。
def get(self):
removelist= ["state"]
new_dict = {}
for key, item in myDict.items():
if key not in removelist:
new_dict.update({key: item})
if isinstance(item, dict):
# You'll need to handle this use case.
return new_dict
详细说明一下,让我们回顾一下您的字典:
myDict= {
"id": 10, # int
"state": "MY LIST", # string
"Stars": { # dictionary
"BookA": {
"id": 10, # int
"state": "new book", # string
"Mystery": { # dictionary
"AuthorA": {
"id": "100",
"state": "thriller"
},
"AuthorB": {
"id": "112",
"state": "horror"
}
},
"Thriller": {
"Store1": {
"id": "300",
"state": "Old"
}
}
}
}
}
为了清楚起见,我在类型中进行了评论。您的代码当前正在解析myDict并忽略键“状态”。按下“星标”值后,您需要解析该词典以忽略键“状态”。