根据列表中嵌套字典中的值删除字典元素



我正在尝试删除列表中带有的嵌套字典中的元素。因此,我有一个列表,它的元素之一是dictionary,然后它的键值之一是diction。我知道我要在最上面的列表和最下面的字典中使用的键,而"中间"字典中的键是可变的。如果底部字典中的值不等于某个值,我想删除"中间"字典中的元素。

我想我需要三个嵌套的for循环才能进入每个字典,但还没能弄清楚如何删除"中间"字典中的元素。

我目前的尝试:

#remove unneccessary elements
def getCleanResults(the_dict1):
for elem1 in the_dict1:
the_dict2 = elem['dict1_key']
for key, elem2 in the_dict2.keys():
the_dict3 = elem2[key]
for elem3 in the_dict3:
if 'keyWanted' in elem3:
del elem2
return the_dict

字典列表的模板我有:

a = {
{'key1':{'key1.1': {'delete': True, 'result': None},
'key1.2': {'delete': False, 'result': None}},'key2': 3},
{'key1':{'key1.1': {'delete': False, 'result': None},
'key1.2': {'delete': True, 'result': None}},'key2': 5}
}

我想删除下面有'delete'的密钥keyx.x,即True,根据上面的例子,这将产生:

a = {
{'key1':{'key1.2': {'delete': False, 'result': None}},'key2': 3},
{'key1':{'key1.1': {'delete': False, 'result': None}},'key2': 5}
}

如上面的例子所示,它们移除的密钥是key1.1key1.2,因此是可变的。

我想,您的困难来自于python对在迭代过程中修改字典的限制。要制作您想要的内容,您需要制作dict的副本——要么制作副本,要么迭代,然后从原始dict中删除键;或者对原始密钥进行迭代,并将"已过滤"的密钥放入新密钥中。稍后可以使用完成

b = {k1: {k2: v2 for k2, v2 in v1.items() if not v2['delete']}
for k1, v1 in a.items()}

编辑:由于某些原因,您提供的代码不一致,上面的解决方案是假设结构实际上是

a = {'key1.1': {'key1.1.1': {'delete': True, 'loremipsum': 'perhaps'},
'key1.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
'key1.2': {'key1.2.1': {'delete': False, 'loremipsum': 'perhaps'},
'key1.2.2': {'delete': False, 'loremipsum': 'perhaps'}},
'key2.1': {'key2.1.1': {'delete': False, 'loremipsum': 'perhaps'},
'key2.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
'key2.2': {'key2.2.1': {'delete': False, 'loremipsum': 'perhaps'},
'key2.2.2': {'delete': True, 'loremipsum': 'perhaps'}}
}
b = {'key1.1': {'key1.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
'key1.2': {'key1.2.1': {'delete': False, 'loremipsum': 'perhaps'},
'key1.2.2': {'delete': False, 'loremipsum': 'perhaps'}},
'key2.1': {'key2.1.1': {'delete': False, 'loremipsum': 'perhaps'},
'key2.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
'key2.2': {'key2.2.1': {'delete': False, 'loremipsum': 'perhaps'}}
}

如果您使用字典a的正确语法,您可以遍历第一层键,然后像您所说的那样,执行嵌套循环以遍历第二层键。_dict1[key1][key2]中的VALUE是最终字典。我使用pprint来帮助可视化词典。

def getCleanResults(the_dict1):
# iterate through the first keys, cast as a tuple to make a copy of the keys iterator (allows for changing dictionary size during iteration)
for key1 in tuple(the_dict1.keys()):
the_dict2 = the_dict1[key1]
# iterate through the second tier keys
for key2 in tuple(the_dict2.keys()):
if the_dict1[key1][key2]['delete']:
del the_dict1[key1][key2]
# no need to return a new dict, it was passed by reference, we modified the original dict. If you wanted a copy of the dict, make copy and return it instead.

正确格式的词典:

a = {
'key1.1': {'key1.1.1': {'delete': True, 'loremipsum': 'perhaps'},
'key1.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
'key1.2': {'key1.2.1': {'delete': False, 'loremipsum': 'perhaps'},
'key1.2.2': {'delete': False, 'loremipsum': 'perhaps'}},
'key2.1': {'key2.1.1': {'delete': False, 'loremipsum': 'perhaps'},
'key2.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
'key2.2': {'key2.2.1': {'delete': False, 'loremipsum': 'perhaps'},
'key2.2.2': {'delete': True, 'loremipsum': 'perhaps'}}
}

测试:

from pprint import pprint
getCleanResults(a)
print()
pprint(a)

输出:

{'key1.1': {'key1.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
'key1.2': {'key1.2.1': {'delete': False, 'loremipsum': 'perhaps'},
'key1.2.2': {'delete': False, 'loremipsum': 'perhaps'}},
'key2.1': {'key2.1.1': {'delete': False, 'loremipsum': 'perhaps'},
'key2.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
'key2.2': {'key2.2.1': {'delete': False, 'loremipsum': 'perhaps'}}}

您可以这样尝试。

代码段

import json
def delete_items(d):
keys1 = d.keys()
new_d = {}
for key1 in keys1:
keys2 = d[key1].keys();
for key2 in keys2:
if type(d[key1][key2]) is dict:
if d[key1][key2]["delete"] == False:
if key1 in new_d:
new_d[key1][key2] = d[key1][key2]
else:
new_d[key1] = {key2: d[key1][key2]}
else:
if key1 in d:
new_d[key1] = {key2: d[key1][key2]}
else:
new_d[key1][key2] = d[key1][key2]
return new_d

a = {
"key1.1": {
"key1.1.1": {
"delete": True,
"loremipsum": "perhaps"
},
"key1.1.2": {
"delete": False,
"loremipsum": "perhaps"
},
"key1.1.3": 4
},
"key1.2": {
"key1.2.1": {
"delete": False,
"loremipsum": "perhaps"
},
"key1.2.2": {
"delete": False,
"loremipsum": "perhaps"
}
},
"key2.1": {
"key2.1.1": {
"delete": False,
"loremipsum": "perhaps"
},
"key2.1.2": {
"delete": False,
"loremipsum": "perhaps"
},
"key2.1.3": 9
},
"key2.2": {
"key2.2.1": {
"delete": False,
"loremipsum": "perhaps"
},
"key2.2.2": {
"delete": True,
"loremipsum": "perhaps"
},
"key2.2.3": 2
}
}
d = delete_items(a)
print(json.dumps(d, indent=4))

输出

{
"key1.2": {
"key1.2.1": {
"delete": false,
"loremipsum": "perhaps"
},
"key1.2.2": {
"delete": false,
"loremipsum": "perhaps"
}
},
"key1.1": {
"key1.1.3": 4,
"key1.1.2": {
"delete": false,
"loremipsum": "perhaps"
}
},
"key2.1": {
"key2.1.3": 9
},
"key2.2": {
"key2.2.3": 2
}
}

最新更新