Python 删除字典列表中的dict-并非所有元素都被删除,需要多次循环

Python 删除字典列表中的dict-并非所有元素都被删除,需要多次循环,python,list,dictionary,Python,List,Dictionary,我有一份长度为793的字典清单。当我试图根据if语句从列表中删除元素时,并不是所有元素都被删除。有几个元素仍然保留在列表中,所有元素只有在同一代码的多次迭代后才会被删除 >>> len(data_list) 793 >>> for i, device in enumerate(data_list): ... if 'PSS' in device['type']: ... print (i) ... del (d

我有一份长度为793的字典清单。当我试图根据if语句从列表中删除元素时,并不是所有元素都被删除。有几个元素仍然保留在列表中,所有元素只有在同一代码的多次迭代后才会被删除

>>> len(data_list)
    793
    >>> for i, device in enumerate(data_list):
    ...  if 'PSS' in device['type']:
    ...   print (i)
    ...   del (data_list[i])
    ...
    47
    83
    127
    207
    279
    ...
    ...
    734
    745
    746
    747
    >>> for i, device in enumerate(data_list):
    ...  if 'PSS' in device['type']:
    ...   print (i)
    ...   del (data_list[i])
    ...
    279
    313
    355
    399
    440
    443
    471
    499
    505
    515
    528
    734
    >>> for i, device in enumerate(data_list):
    ...  if 'PSS' in device['type']:
    ...   print (i)
    ...   del (data_list[i])
    ...
    734
    >>> for i, device in enumerate(data_list):
    ...  if 'PSS' in device['type']:
    ...   print (i)
    ...   del (data_list[i])
    ...
    >>>

在列表上迭代并同时在其上删除/添加元素不是一个好主意,因为当您删除索引
i
处的元素时,下一个(
i+1
)移动到位置
i
,但是循环继续,并为您提供
i+1
,因此您错过了它。事实上,您将错过紧跟在匹配元素之后的元素

更好的方法恰恰相反:保留匹配的

  • 使用列表编译

    data_list = [device for device in data_list if 'PSS' in device['type']]
    
  • 使用过滤器

    data_list = list(filter(lambda device:'PSS' in device['type'], data_list))