Как сохранить изменения объекта при выходе из цикла python
Имеется list, состоящий из dict`ов Мне нужно оставить только те словари, в которых values() определенных ключей соответствуют условию.
Я сделал цикл который в общем-то выполняет эту функцию:
list = [{},{},{}]
for i in list:
for a in i.values():
if a == 'no':
print(i)
В консоль действительно выводятся значения, которые мне нужно удалить.
Но когда я делаю так:
list = [{},{},{}]
for i in list:
for a in i.values():
if a == 'no':
list.remove(i)
print(list)
Я получаю первоначальный список без каких-либо изменений. Вопрос в том, как мне обновить список с учетом изменений, ведь если я запущу его внутри цикла - он будет принтиться тысячи раз
Ответы (1 шт):
Во-первых, никогда внутри цикла не меняйте тот список, по которому идёт этот цикл. Ваш код будет пропускать часть словарей, которые вы хотели удалить. (Хотя какие-то он всё-таки должен удалить, так что мне не верится, что на выходе вы получаете список вообще без изменений)
Во-вторых, сразу приучайтесь использовать такие возможности языка, как списковые включения. Особенно если речь идёт просто о фильтрации списка, делать такое циклом - не самое удачное решение.
data = [{},{'a': 'no'},{}]
wrong_dict = lambda dct: 'no' in dct.values()
data = [item for item in data if not wrong_dict(item)]
print(data)
UPD: И, кстати, не используйте слово list в качестве имени переменной - это название встроенной функции, его перезапись может привести к неожиданным спецэффектам в коде.