Убрать определенные элементы словарей объединенных в список

Есть задача убрать из словарей элементы с ключом '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'}]

Вопрос:

  1. где ошибка?
  2. Что значит '[{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)
→ Ссылка