我有一个嵌套字典的列表:
[{'a': 1,
'b': 'string',
'c': [{'key1': 80,
'key2': 'string',
'key3': 4033},
{'key1': 324,
'key2': 'string',
'key3': 4034,
'key4': 1}]},
{'a': 1,
'b': 'string',
'c': [{'key1': 80,
'key2': 'string',
'key3': 4033},
{'key1': 324,
'key2': 'string',
'key3': 4034,
'key4': 1,
'key5': 2}]}]
请不要使键c
的值再次是词典列表。
现在,我想从此列表中筛选出所有键为c
的字典,这些字典不包含key1
,key2
,key3
和key4
。
我想到了首先在列表中的第一个,第二个等等上循环,然后在具有dict
作为键的嵌套dict
上循环。然后,如果c
中的dict
不符合我的要求,我将其删除。
因此我的代码将是:
c
但是我遇到for j in range(len(mydict)):
for i in range(len(mydict[j]["c"])):
if not all (k in mydict[j]["c"][i] for k in ("key1", "key2", "key3", "key4")):
del(mydict[j]["c"][i])
错误。我的错误在哪里?
我想要的输出是:
IndexError: list index out of range
答案 0 :(得分:2)
问题在于,使用for i in range(len(mydict[j]["c"])):
可以迭代字典中的列表,同时从这些列表中删除它们。相反,您可以将内部循环替换为列表理解:
for d in mydict:
d['c'] = [d2 for d2 in d['c']
if all(k in d2 for k in ("key1", "key2", "key3", "key4"))]
答案 1 :(得分:1)
只需另一个选择:
keep = {'key1', 'key2', 'key3', 'key4'}
for h in mydict:
h['c'] = [ e for e in h['c'] if len(keep - set(e.keys())) == 0 ]
答案 2 :(得分:1)
如果您希望对此有其他看法:
def remove_keys(mydict):
mydict2 = mydict
keys = ['key1', 'key2', 'key3', 'key4']
for xIndex, x in enumerate(mydict):
for yIndex, y in enumerate(x['c']):
if not all(key in y.keys() for key in keys):
del mydict2[xIndex]['c'][yIndex]
return mydict2
返回修改后的新词典。