【问题标题】:remove element in nested dict by list of keys通过键列表删除嵌套字典中的元素
【发布时间】:2018-04-26 13:36:35
【问题描述】:

我有一个像这样的嵌套字典结构:

dataDict = {
"a":{
    "r": 1,
    "s": 2,
    "t": 3
    },
"b":{
    "u": 1,
    "v": {
        "x": 1,
        "y": 2,
        "z": 3
    },
    "w": 3
    }
}    

带有键列表:

maplist = ["b", "v", "y"]

我想删除地图列表指向的字典中的项目。有什么建议吗?

【问题讨论】:

  • 建议:不要删除项目,建立一个新的字典;并简单地递归遍历dataDict。来自提问者的编码工作受到赞赏
  • 我无法理解确切的问题。你能写出预期的结果吗?
  • 下面的答案有帮助吗?随意接受答案(左侧的绿色勾号),或要求澄清。

标签: python dictionary


【解决方案1】:

这是一种方式。以后请参考the question您在哪里找到这些数据。

getFromDict函数courtesy of @MartijnPieters

from functools import reduce
import operator

def getFromDict(dataDict, mapList):
    return reduce(operator.getitem, mapList[:-1], dataDict)

maplist = ["b", "v", "y"]

del getFromDict(dataDict, maplist)[maplist[-1]]

【讨论】:

    【解决方案2】:

    访问后使用del即可:

    del dataDict[maplist[0]][maplist[1]][maplist[2]]
    

    给出:

    dataDict = {
    "a":{
        "r": 1,
        "s": 2,
        "t": 3
        },
    "b":{
        "u": 1,
        "v": {
            "x": 1,
            "z": 3
        },
        "w": 3
        }
    }
    

    【讨论】:

    • 这适用于长度为 3 的列表,但不适用于任意长度的列表。相关的给定字典结构。
    【解决方案3】:
    for k in maplist:
        if k in dataDict:
            del dataDict[k]
    

    输出:

    {'a': {'s': 2, 'r': 1, 't': 3}}
    

    【讨论】:

    • 这仅适用于字典中的第一级键,不适用于嵌套字典,请使用 maplist = ['v', 'y'] 尝试您的代码
    • 啊!我不知道,让我修改。
    【解决方案4】:

    你可以使用递归:

    maplist = ["b", "v", "y"]
    dataDict = {'a': {'s': 2, 'r': 1, 't': 3}, 'b': {'u': 1, 'w': 3, 'v': {'y': 2, 'x': 1, 'z': 3}}}  
    def remove_keys(d):
      return {a:remove_keys(b) if isinstance(b, dict) else b for a, b in d.items() if a not in maplist}
    
    final_result = remove_keys(dataDict)
    

    输出:

    {'a': {'s': 2, 'r': 1, 't': 3}}
    

    【讨论】:

      猜你喜欢
      • 2019-06-04
      • 2021-12-08
      • 2013-01-19
      • 2016-04-22
      • 1970-01-01
      • 2020-02-29
      • 2017-03-08
      相关资源
      最近更新 更多