Удалить словарь из списка словарей по значению одного из ключей
Есть словарь
a = [{"animal": "cats", "color": "red yellow blue"},
{"animal": "dogs", "color": "brown green black"},
{"animal": "birds", "color": "purple white pink"},
...]
И есть список слов:
b = ["yellow", "black" ...]
Необходимо полностью удалить словарь из списка, если второй элемент значения ключа "color" находится в списке b.
То есть на выходе нужно получить такой список словарей:
a = [{"animal": "dogs", "color": "brown green black"},
{"animal": "birds", "color": "purple white pink"},
...]
Пыталась реализовать следующим образом, но не получаю нужного результата:
for i in a:
words = []
for word in i['color'].split():
words.append(word)
if words[1] in b:
del i
Помогите, пожалуйста, справиться с задачей
Ответы (3 шт):
Идём по списку a. Для каждого элемента этого списка (словарь d) берём значение по ключу d["color"], разбиваем его split(), берём второй элемент [1] и проверяем что он не в списке b. Если это так, то весь словарь помещается в результарующий список c.
c = [d for d in a if d["color"].split()[1] not in b]
Замените i['word'] на i['color'] (в словарях нет ключа word, вам нужен ключ color), а del i на a.remove(i) (вам нужно удалить словарь i из списка a).
PS. Но так делать не нужно, потому что если список достаточно большой и из него будет удаляться много элементов, возникнут проблемы.
Ну и ещё вариант в формате вашего кода, только упрощённый и работающий:
for i,d in enumerate(a.copy()):
if d['color'].split()[1] in b:
del a[i]
- итерируемся по копии, чтобы не сломать итерацию
- удаляем элемент по индексу
- про более простую проверку вам уже все написали