Удалить словари из списка
Есть словарь:
sp = {'animals': [{'animal': 'tiger', 'n': 1, 'id': [3]}, {'animal': 'bear', 'n': 4, 'id': [1, 2, 3, 4]}, {'animal': 'hare', 'n': 1, 'id': [1]}],
'birds': [{'bird': 'tit', 'n': 2, 'id': [3, 4]}, {'bird': 'sparrow', 'n': 1, 'id': [1]}, {'bird': 'woodpecker', 'n': 2, 'id': [1, 4]}],
'fish': [{'fish': 'perch', 'n': 3, 'id': [1, 3, 4]}, {'fish': 'herring', 'n': 1, 'id': [4]}, {'fish': 'shark', 'n': 1, 'id': [2]}]}
Необходимо создать новый словарь, в котором будут находиться значения из старого словаря, в которых в поле 'id' более одного значения, то есть необходимо получить словарь вида:
sp_new = {'animals': [{'animal': 'bear', 'n': 4, 'id': [1, 2, 3, 4]}],
'birds': [{'bird': 'tit', 'n': 2, 'id': [3, 4]}, {'bird': 'woodpecker', 'n': 2, 'id': [1, 4]}],
'fish': [{'fish': 'perch', 'n': 3, 'id': [1, 3, 4]}]}
В качестве решения использую такой алгоритм:
for key, value in sp.items():
for i in range(0, len(value)):
if len(value[i]['id']) == 1:
del value[i]
Но тут при удалении какого словаря сбивается итерация. Знаю, что можно использовать метод reversed в цикле, но хотелось бы понять, как решить данную проблему с использованием нового словаря
Ответы (1 шт):
Автор решения: gil9red
→ Ссылка
Попробуйте
Входные данные:
sp = {
'animals': [
{'animal': 'tiger', 'n': 1, 'id': [3]},
{'animal': 'bear', 'n': 4, 'id': [1, 2, 3, 4]},
{'animal': 'hare', 'n': 1, 'id': [1]}
],
'birds': [
{'bird': 'tit', 'n': 2, 'id': [3, 4]},
{'bird': 'sparrow', 'n': 1, 'id': [1]},
{'bird': 'woodpecker', 'n': 2, 'id': [1, 4]}
],
'fish': [
{'fish': 'perch', 'n': 3, 'id': [1, 3, 4]},
{'fish': 'herring', 'n': 1, 'id': [4]},
{'fish': 'shark', 'n': 1, 'id': [2]}
]
}
Создание нового словаря:
sp_new = dict()
for k, items in sp.items():
sp_new[k] = [item for item in items if len(item['id']) > 1]
Через генератор:
sp_new = {
k: [item for item in items if len(item['id']) > 1]
for k, items in sp.items()
}
Проверка:
expected = {'animals': [{'animal': 'bear', 'n': 4, 'id': [1, 2, 3, 4]}],
'birds': [{'bird': 'tit', 'n': 2, 'id': [3, 4]}, {'bird': 'woodpecker', 'n': 2, 'id': [1, 4]}],
'fish': [{'fish': 'perch', 'n': 3, 'id': [1, 3, 4]}]}
assert sp_new == expected