所以我在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]
答案 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