Убрать определенные элементы словарей объединенных в список
Есть задача убрать из словарей элементы с ключом 'key1' вот таким образом:
Original List:
[{'key1': 'value1', 'key2': 'value2'}, {'key1': 'value3', 'key2': 'value4'}]
New List:
[{'key2': 'value2'}, {'key2': 'value4'}]
Есть вот такое решение:
l = [{'key1':'value1', 'key2':'value2'}, {'key1':'value3', 'key2':'value4'}]
l1 = [{k: v for k, v in d.items() if k != 'key1'} for d in original_list]
l1
[{'key2': 'value2'}, {'key2': 'value4'}]
мне не понятен вот этот кусок кода: '[{k: v'. С целью разобраться я попытался преобразовать List comprehesion в nested loops:
def func(l):
li = []
d = {}
for i in l:
for k,v in i.items():
if k != 'key1':
d[k] = v
li.append(d)
return li
l = [{'key1':'value1', 'key2':'value2'}, {'key1':'value3', 'key2':'value4'}]
func(l)
Вот что получилось:
[{'key2': 'value4'}, {'key2': 'value4'}]
Вопрос:
- где ошибка?
- Что значит '[{k: v' в первом варианте и как этот участок кода преобразовать в обычный цикл?
Ответы (2 шт):
Автор решения: Даниил Чижевский
→ Ссылка
Ошибка в том, что вы используете переменную d много раз и не очищаете её. Вот верный код:
def func(l):
li = []
for i in l:
d = {}
for k,v in i.items():
if k != 'key1':
d[k] = v
li.append(d)
return li
В остальном ваше преобразование верно. Фрагмент k: v означает просто конструкцию ключ: значение (key: value), которую вы заменили строкой d[k] = v.
Автор решения: Andrey Maslov
→ Ссылка
если нужно модифицировать исходный список, а не получить другую копию, то можно пойти другим путем - удалять из исходных словарей ненужный ключ
dict_list = [{'key1': 'value1', 'key2': 'value2'}, {'key1': 'value1', 'key3': 'value3'}]
for dict_item in dict_list:
dict_item.pop('key1', None)