Python - 将字典列表转换为带有列表的字典

时间:2017-01-16 13:00:36

标签: python dictionary

所以我在Python中聚合数据时遇到了困难。 我编写了一个程序,从Oracle DB中提取数据并将其转换为带字典的列表。每个字典都包含DB列名称作为键

看起来像这样:

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

我遇到的问题是多余的列名。从这个词典列表中,我想创建一个字典,其中每个列名只包含一次作为键。之后添加属于该列名的值列表。

任何想法?

我正在使用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]

3 个答案:

答案 0 :(得分:1)

而不是:

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

尝试:

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

答案 1 :(得分:0)

由于重复键,以前的存储数据的方式确实不是最佳方式。试试这个:

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, ...], ...}

但说实话,最好的方法不是首先建立字典列表,而是直接找到列表字典。现在要有效地做到这一点,人们必须更多地了解数据库的结构+我相信你可以自己做。只需将查询元组返回的索引与列名相关联即可。

希望我帮助过。

答案 2 :(得分: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