0

Имеется 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)

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

Lumxi
  • 405

1 Answers1

3

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

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

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

Xander
  • 20,499
  • Спасибо! Это решение работает как надо

    Вероятно, список и был частично изменен, просто я бегло осматривал его на наличие "no" и делал вывод по этому признаку. Значений "no" оставалось очень много.

    Название list использовал просто для наглядности. Видимо, bad practice)

    Списковые включения для меня новая конструкция. К сожалению, довольно сложно находить информацию о подобных решениях и о правильных решениях применительно к задачам в целом. Вероятно, вы могли бы посоветовать хорошую литературу об этом? В любом случае, большое спасибо за ответ!

    – Lumxi Feb 13 '20 at 11:39
  • 1
    @ptpwork, посмотрите вот здесь https://pythonworld.ru/samouchitel-python Этот самоучитель и сам по себе хорош, а ниже ещё список литературы есть. – Xander Feb 13 '20 at 12:08
  • 1
    @ptpwork, плюс большая подборка учебных материалов есть здесь: https://ru.stackoverflow.com/questions/420125/%D0%9A%D0%BD%D0%B8%D0%B3%D0%B8-%D0%B8-%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D1%8B%D0%B5-%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B-%D0%BF%D0%BE-python – Xander Feb 13 '20 at 12:09