Как получить список словарей из следующего кода? - PullRequest
0 голосов
/ 07 мая 2019

Мне нужно получить список словарей. Словарь создается из двух разных списков, где один представляет собой список списков. Я получаю только последний результат итерации в качестве вывода. Могу ли я узнать, какую ошибку я сделал в следующем коде? Заранее большое спасибо.

d = ['Good','Bad','Lazy']
main_list=[[0,1,2],[3,4,5],[6,7,8]]
dict2={"eventType": "custom Event Name", "attribute1": "value"}
list1=[]

for item in main_list:
    dict2.update(dict(zip(d,item)))
    list1.append(dict2)

print("LIST: ",list1)

ОЖИДАЕМЫЙ ВЫХОД:

 LIST:  [{'eventType': 'custom Event Name', 'attribute1': 'value', 'Good': 0, 'Bad': 1, 'Lazy': 2}, {'eventType': 'custom Event Name', 'attribute1': 'value', 'Good': 3, 'Bad': 4, 'Lazy': 5}, {'eventType': 'custom Event Name', 'attribute1': 'value', 'Good': 6, 'Bad': 7, 'Lazy': 8}]

ВЫХОД, ЧТО Я ПОЛУЧИЛ:

LIST:  [{'eventType': 'custom Event Name', 'attribute1': 'value', 'Good': 6, 'Bad': 7, 'Lazy': 8}, {'eventType': 'custom Event Name', 'attribute1': 'value', 'Good': 6, 'Bad': 7, 'Lazy': 8}, {'eventType': 'custom Event Name', 'attribute1': 'value', 'Good': 6, 'Bad': 7, 'Lazy': 8}]

Ответы [ 2 ]

2 голосов
/ 07 мая 2019

Это потому, что вы всегда обновляете один и тот же dict экземпляр.

Способ решить эту проблему - создать новый локальный экземпляр с обновленными полями:

for item in main_list:
    updated_dict = dict(dict2, **dict(zip(d, item)))
    list1.append(updated_dict)

В качестве примечания вы можете достичь того же, используя понимание списка, что дает более компактный (и, возможно, более чистый) код.

list1 = [dict(dict2, **dict(zip(d, item))) for item in main_list]
0 голосов
/ 07 мая 2019

Вместо этой строки list1.append(dict2), попробуйте это:

from copy import deepcopy

list1.append(deepcopy(dict2))

Ваш код работает хорошо. единственная проблема заключается в том, что вы добавляете dict2 каждый раз в список на следующей итерации. при изменении dict2 это изменит все предыдущие элементы, которые были добавлены в список.

с модулем copy вы создадите копию dict2 в список и, изменив dict2, предыдущие элементы останутся такими, как было, для лучшего понимания поместите print(list1) в цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...