2017-01-16 2 views
0

Так что у меня возникают трудности с агрегированием данных в Python. Я написал программу, которая извлекает данные из БД Oracle и преобразует ее в список со словарями. Каждый словарь содержит имена столбцов БДА в качестве ключейPython - превращение списка словарей в словарь со списками

выглядящих примерно так:

[{ColumnName1 : Value, Columnname2 : Value}, 
{ColumnName1 : Value, Columnname2 : Value}] 

Проблемы у меня есть избыточное columnnames. Из этого списка словарей я хотел бы создать словарь, содержащий каждое имя столбца, как ключ только один раз. После этого добавляется список значений, принадлежащих этому столбцу.

Любые идеи?

Я использую Cx_Oracle для извлечения данных из БД. Я использую следующий код для создания списка словарей. Причина, по которой я делаю это, заключается в том, что Oracle_CX не возвращает имена столбцов, и мне это действительно нужно.

Код для создания списка словарей:

def rows_to_dict_list(cursor): 
    columns = [i[0] for i in cursor.description] 
    return [dict(zip(columns, row)) for row in cursor] 
+1

Какая у вас желаемая структура данных? Пожалуйста, отредактируйте вопрос, чтобы привести пример –

ответ

1

Вместо:

def rows_to_dict_list(cursor): 
    columns = [i[0] for i in cursor.description] 
    return [dict(zip(columns, row)) for row in cursor] 

Try:

def rows_to_dict_list(cursor): 
    columns = [i[0] for i in cursor.description] 
    out = {i[0]: [] for i in cursor.description} 
    for row in cursor: 
     for key, value in zip(columns, row): 
      out[key].append(value) 
return out 
+0

Спасибо, это сработало !. Должен признаться, я не совсем понимаю, что вы сделали. Не могли бы вы объяснить это? – MrBrammie24

+0

Итак, в своем коде вы сначала создаете список имен столбцов (переменная 'columns'), затем вы возвращаете список словарей строк (словарь zip столбцов и данных строк). В моем коде вместо этого мы создаем словарь имен столбцов с пустыми списками в качестве значений, а затем итерируем через набор данных, сначала по строке, затем по паре ключей и значений (создаем зачистки столбцов и строки, как в вашем код). Для каждой пары значений ключа мы добавляем значение в список клавиш в выходном словаре, что приводит к желаемому формату. –

0

Предыдущий способ storring ваши данные действительно не являются оптимальными из-за повторения ключей. Попробуйте это:

old = [{ColumnName1 : Value11, Columnname2 : Value21, ...}, {ColumnName1 : Value12, Columnname2 : Value22, ...}, ...] 
new_dict = {} 
for subdict in a: 
    for k, v in subdict.items(): 
     new_dict.setdefault(k, []).append(v) # thanks to @volcano 
print(new_dict) # {ColumnName1: [value11, value12, ...], ColumnName1: [value12, value22, ...], ...} 

Но, честно говоря, лучше всего было бы не строить список словарей, в первую очередь, и идти для словаря списков непосредственно. Теперь для этого вам нужно будет немного узнать о структуре вашего БД +, я считаю, что вы можете сделать это самостоятельно. Просто скорректируйте индексы возвращаемых кортежей запросов на имена столбцов, и все готово.

Надеюсь, я помог.

+0

Итерация по значениям в моих словарях невозможна. Значениями являются частоты с плавающей точкой, целые числа, даты. – MrBrammie24

+0

Упс, опечатка. Сожалею. Вам не нужно перебирать значения. –

+0

@ Ev.Kounis, вам действительно не нужно назначение - одна строка * new_dict.setdefault (k, []). Append (v) * будет делать – volcano

0

Не сделать этот список словарей, в первую очередь; создайте словарь.

def rows_to_lists_dict(cursor): 
    column_names = [i[0] for i in cursor.description] 
    columns = {name: [] for name in column_names} 
    for row in cursor: 
     for name, column in zip(column_names, row): 
      columns[name].append(column) 
    return columns 
Смежные вопросы