Python составляет список диктов из списка кортежей - PullRequest
0 голосов
/ 15 мая 2018

из базы данных я получил результат в формате:

result = ([('A', 210L), ('B', 1L), ('C', 269L)], 3)

Мне нужно изменить его в Python на:

[{'description':'A','sum':210},{'description':'B','sum':1},{'description':'C','sum':269}]

Я пробовал разные варианты, но не получил то, что мне нужно ..

rows = len(result[0])
description_sum = {}
all_descriptions_sums = []
for i in range(rows):
    description_sum['description'] = result[0][i][0]
    description_sum['sum'] = int(result[0][i][1])
    all_descriptions_sums.append(description_sum)
return all_descriptions_sums

В результате:

[{'description':'C','sum':269},{'description':'C','sum':269},{'description':'C','sum':269}]

Таким образом, на шаге all_descriptions_sums.append(description_sum) словарь не только добавляется в список, но и переписывает предыдущее значение.

Большое спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Вам нужно переместить description_sum в цикл for.

all_descriptions_sums = []
for i in range(rows):
    description_sum = {}
    description_sum['description'] = result[0][i][0]
    description_sum['sum'] = int(result[0][i][1])
    all_descriptions_sums.append(description_sum)

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

0 голосов
/ 15 мая 2018

Следующий код решит вашу проблему:

# Input data
result = ([('A', 210L), ('B', 1L), ('C', 269L)], 3)
# Result list
list_result = []
# The input is:
# - a 2-tuple containing:
#   - a list of 2-tuples with (database field) values
#   - length of the list ("number of rows returned")
# Therefore we iterate the first member of the outermost 2-tuple
for item in result[0]:
    # Long version for clarity:
    d = dict()
    d['description'] = item[0]
    d['sum'] = int(item[1])
    list_result.append(d)
    # The short version:
    # list_result.append({'description': item[0], 'sum': int(item[1])})

И как только вы освоитесь с приведенным выше, мы можем сократить все вышеперечисленное до двух строк:

# Input data
result = ([('A', 210L), ('B', 1L), ('C', 269L)], 3)
# Reformat to dicts with field names as keys
rows = [{'description': a, 'sum': b} for a,b in result[0]]
0 голосов
/ 15 мая 2018

Вы можете просто использовать понимание списка:

result = [{'description': a, 'sum': int(b)} for a, b in result[0]]

Но если вы не хотите, то, что не так в вашем коде, это то, что вы инициализируете словарь перед циклом.Вы должны повторно объявить его в каждой итерации, как в:

rows = len(result[0])
all_descriptions_sums = []
for i in range(rows):
    description_sum = {}
    description_sum['description'] = result[0][i][0]
    description_sum['sum'] = int(result[0][i][1])
    all_descriptions_sums.append(description_sum)
return all_descriptions_sums
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...