例如我有一个词典:
{
"a" : 123,
"b" : {
"a" : 24324,
"c" : 9
},
"c" : {
"a" : 123,
"b" : 64
}
}
从此词典中删除所有a
字段的最佳方法是什么?我理解,我可以对这个dict进行迭代,删除a
字段,迭代键,这也是dicts等等。
但也许有更优雅的方式来做它?
修改
谢谢你的回答!但是,当密钥可以是列表时,例如"b" : [{"a" : 1, "c" : 2}]
答案 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)