从嵌套字典中删除一些字段?

时间:2017-11-08 15:57:41

标签: python dictionary

例如我有一个词典:

{
    "a" : 123,
    "b" : {
        "a" : 24324,
        "c" : 9
    },
    "c" : {
        "a" : 123,
        "b" : 64
    }
}

从此词典中删除所有a字段的最佳方法是什么?我理解,我可以对这个dict进行迭代,删除a字段,迭代键,这也是dicts等等。

但也许有更优雅的方式来做它?

修改 谢谢你的回答!但是,当密钥可以是列表时,例如"b" : [{"a" : 1, "c" : 2}]

,情况如何呢?

4 个答案:

答案 0 :(得分:2)

好吧,在内部你必须逐个处理这些项目,无论是通过手动迭代还是递归。

这是使用递归的尝试:

def remove_keys(d, to_remove):
    if not isinstance(d, dict):
        return d
    return {k: remove_keys(v, to_remove)
            for k, v in d.items() if k not in to_remove}

您只需将字典作为第一个参数进行处理,并将要删除的键的名称(最好为set)作为第二个参数。在你的情况下:

remove_keys(d, {"a"})

它是否更优雅,取决于你的口味,我会说:)。

如果你想实际改变字典:

def remove_keys_m(d, to_remove):
    if not isinstance(d, dict):
        return d
    for k in to_remove:
        if k in d:
            del d[k]
    for k in d:
            d[k] = remove_keys(d[k], to_remove)
    return d

答案 1 :(得分:1)

viewController

这是一个非常基本的递归函数

编辑:

如果你还想处理嵌套在dicts中,嵌套在列表中的列表等,那么下面的内容将是owrk。

bounds

答案 2 :(得分:0)

虽然递归解决方案更加健壮,但这是一个更简单的解决方案,适用于已发布的示例和只有一个嵌套层的任何其他字典:

s = {
   "a" : 123,
   "b" : {
     "a" : 24324,
     "c" : 9
   },
  "c" : {
       "a" : 123,
      "b" : 64
  }
} 

final_data = {a:{c:d for c, d in b.items() if c != "a"} for a, b in s.items() if a != "a"}

输出:

{'c': {'b': 64}, 'b': {'c': 9}}

答案 3 :(得分:0)

我认为这个例子会回答你的问题。

dic = {"a": 1,
       "b": {"a": 2,
             "c": {"a": 3}},
       "d": 4}
key_to_del = "a"

def get_key(dic):
    for key, value in dic.items():
        if key == key_to_del:
            del dic[key]
        if isinstance(value, dict):
            get_key(value)
    return dic

print "BEFOR", dic
print "AFTER", get_key(dic)

enter image description here