Удаление элемента из списка в цикле for [дубликат]

avatar
Josh Wren
8 августа 2021 в 21:47
65
1
2

У меня есть список, в котором есть списки со словарями. Я пытаюсь проверить одно из значений ключа внутри словаря, и если это попытка, я удаляю этот список из списка. Я немного запутался со слоями списков и словарей, которые здесь происходят, и я думал, что у меня есть хорошее решение, но, похоже, это мешает индексу цикла for, когда я делаю это так, как я думал, будет работать, а затем удаляется только первое совпадение.

Вот пример того, что у меня происходит.

master_list = [
  {"irrelevant_key": "irrevelant_value", 
   "releveant_key": 
                  [{"first_value": "first_key"}, {"problem_key": 0}],
                  [{"second_value": "second_key"}, {"problem_key": 1}]
  }]

for index, key in enumerate(master_list):
  for item in master_list[index]["relevant_key"]:
    if item[1]["problem_key"] == 0:
      master_list[index]["relevant_key"].remove(item)

Поэтому я уверен, что есть более элегантный и лучший способ сделать это с каким-то пониманием, но я заметил, что когда я удаляю элемент, остальные элементы возвращаются на один, поэтому итерация не работает. как я и ожидал.

Источник
Kuang Wenyi
8 августа 2021 в 21:57
0

Вы всегда можете создать еще одну копию своего списка и отфильтровать исходное значение. Я действительно не думаю, что удаление на лету - хорошая практика.

Kuang Wenyi
8 августа 2021 в 22:03
0

coderhelper.com/questions/3485475/… Или вы можете использовать что-то вроде этого, создать список только для чтения и выполнять действия на его основе.

Ответы (1)

avatar
Mohammad
8 августа 2021 в 22:04
2

Не рекомендуется удалять элементы из списка во время его циклического просмотра. Вы всегда можете сделать копию и обновить ее:

import copy
my_list= copy.deepcopy(master_list)

Однако лучшим подходом было бы использование спискового понимания:

master_list = [{"irrelevant_key": "irrevelant_value", 
                "relevant_key": 
                  [[{"first_value": "first_key"}, {"problem_key": 0}],
                  [{"second_value": "second_key"}, {"problem_key": 1}]],
                }]
for lst in master_list:
  lst['relevant_key'] = [x for x in lst['relevant_key'] if x[1]['problem_key'] != 0 ]