Ваша первая проблема здесь:
# Adding dictionaries from l1 into l3
for dict1 in l1:
l3.append(dict1)
print(l3)
Вы копируете ссылки на все слова в первом списке. Они такие же, как в вашем первом списке. Это означает, что редактирование dict (как при вызове update()
) повлияет на оба списков.
# Opening l3 to loop through each dictionary, using range(len()) to loop through the index positions
for i in range(len(l3)):
# Opening l2 to loop through each dictionary
for dict2 in l2:
l3[i].update(dict2)
print(l3)
# Tried inverting the lists here, looping through l2 and then looping through l3 to append all dictionaries in l2
for dict2 in l2:
for i in range(len(l3)):
l3[i].update(dict2)
print(l3)
Здесь вы дважды просматриваете диктовки. l3
является копией l1
, и для каждого элемента в этом списке вы обновляете его данными каждого элементов в l2
. У Dicts должны быть уникальные ключи, поэтому каждый раз, когда вы обновляете ключи a
и b
, он перезаписывает предыдущие значения.
Тогда вы в основном делаете то же самое, но в другом порядке.
Что Вы хотите сделать это, повторяя указания в каждом списке одновременно, и создавая новые указания из данных в каждом. У точек в каждом месте списка есть уникальные ключи, поэтому перезаписи не будет.
l3 = [{**d1, **d2} for d1, d2 in zip(l1, l2)]
zip()
- правильная функция для использования здесь. Он берет по одному предмету из каждого списка и передает их вам в паре. Предмет в позиции i
в одном и другом списке.
>>> print(list(zip(l1, l2)))
[({'A': 1}, {'B': 4}), ({'A': 2}, {'B': 5}), ({'A': 3}, {'B': 6})]
Так что, как только вы это сделаете, создайте новый диктат из исходных диктов. Как вы знаете, {}
является синтаксисом для нового dict, а выполнение **
для переменной означает извлечение элементов (пар ключ / значение) и вставку их в новый dict.
Другой, менее pythoni c, но, возможно, проще для нового ie способа написать это было бы так:
l3 = []
for d1, d2 in zip(l1, l2):
d3 = {}
d3.update(d1)
d3.update(d2)
l3.append(d3)
Надеюсь, вы сможете оценить краткость первого решения.