从嵌套字典中删除所有出现的值

时间:2019-05-07 18:35:45

标签: python dictionary

我有一个嵌套的字典,如下所示。

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

它不会删除所有“状态”值。

2 个答案:

答案 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并忽略键“状态”。按下“星标”值后,您需要解析该词典以忽略键“状态”。