Перевод словаря в список через цикл for

#python #django #list #dictionary #django-rest-framework

#python #django #Список #словарь #django-rest-framework

Вопрос:

Я хочу вставить два словаря в список через цикл for. Я не понимаю, почему он не работает. Не могли бы вы, пожалуйста, помочь? 🙂

 result = {}
results = []
for i in range(count): # Count is 2, 2 different dictionaries
    result.update({
        'workitem_id': str(api_results[i]['workitem_id']),
        'workitem_header': api_results[i]['workitem_header'],
        'workitem_desc': api_results[i]['workitem_desc'],
        'workitem_duration': str(api_results[i]['workitem_duration'])})
    print(result) # Shows the two different dictionaries
    results.append(result) 

print(results) # Shows the list of two dictionaries, but the list contains the last dictionary for 2 times. 

Output print(result): {Dictionary 1} , {Dictionary 2}
Output print(results): [{Dictionary 2} , {Dictionary 2}]
 

Ожидаемый результат печати (результаты):

 [{Dictionary 1}, {Dictionary 2}]
 

Комментарии:

1. Объявить result = {} внутри цикла.

2. Вы постоянно обновляете один и тот же словарь.

Ответ №1:

    results = []
   for i in range(count): #->Count is 2, 2 different dictionaries
      result = {
            'workitem_id' :str(api_results[i]['workitem_id']),
            'workitem_header':api_results[i]['workitem_header'],
            'workitem_desc':api_results[i]['workitem_desc'],
            'workitem_duration':str(api_results[i] ['workitem_duration'])}
      print(result) 
      results.append(result) 

   print(results) 
 

Комментарии:

1. Глупый я. Спасибо 🙂

Ответ №2:

Во время второй итерации метод .update обновит первый словарь в списке. Это потому, что два словаря указывают на одну и ту же ссылку.

Аналогичным примером может быть:

 a = [1, 2, 3]
b = a
a[0] = 'this value is changed in b as well'
print(b)
#['this value is changed in b as well', 2, 3]
 

Ответ №3:

Есть ли какая-либо причина, по которой мы не просто используем более простой for цикл?

 results = []
for x in api_results: 
    result = {
        'workitem_id': str(x['workitem_id']),
        'workitem_header': x['workitem_header'],
        'workitem_desc': x['workitem_desc'],
        'workitem_duration': str(x['workitem_duration'])
    }
    results.append(result) 

print(results) 

 

Ответ №4:

Вам нужно сделать что-то вроде

 dictionaries = [  # Let this be the list of dictionaries you have (in your api response?)
    {
        'workitem_id': 1,
        'workitem_header': 'header1',
        'workitem_desc': 'description2',
        'workitem_duration': 'duration2'
    },
    {
        'workitem_id': 2,
        'workitem_header': 'header2',
        'workitem_desc': 'description2',
        'workitem_duration': 'duration2'
    }
]

results = []
for dictionary in dictionaries:
    results.append(dictionary)

print(results)