Как сохранить изменения объекта при выходе из цикла 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 шт):

Автор решения: Xander

Во-первых, никогда внутри цикла не меняйте тот список, по которому идёт этот цикл. Ваш код будет пропускать часть словарей, которые вы хотели удалить. (Хотя какие-то он всё-таки должен удалить, так что мне не верится, что на выходе вы получаете список вообще без изменений)

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

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 в качестве имени переменной - это название встроенной функции, его перезапись может привести к неожиданным спецэффектам в коде.

→ Ссылка