Удаление dict в списке словарей - удаляются не все элементы, нужно l oop несколько раз - PullRequest
0 голосов
/ 05 мая 2020

У меня есть список словарей длиной 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])
    ...
    >>>

1 Ответ

1 голос
/ 05 мая 2020

Итерация по списку и одновременное удаление / добавление элемента в нем - не лучшая идея, потому что, когда вы удаляете элемент с индексом i, следующий (i+1) перемещается в позицию i но l oop продолжается и дает вам 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))
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...