循环嵌套字典,如果不满足条件则删除(python)

时间:2019-02-20 13:44:31

标签: python list dictionary for-loop

我有一个嵌套字典的列表:

[{'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的字典,这些字典不包含key1key2key3key4

我想到了首先在列表中的第一个,第二个等等上循环,然后在具有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

3 个答案:

答案 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

返回修改后的新词典。

相关问题