PyA*_*yAn 6 python csv dictionary
假设我有这样的字典数据集列表,
data_set = [
{'Active rate': [0.98, 0.97, 0.96]},
{'Operating Expense': [3.104, 3.102, 3.101]}
]
Run Code Online (Sandbox Code Playgroud)
我需要迭代字典列表并将键作为列标题及其值作为行并将其写入CSV文件.
Active rate Operating Expense
0.98 3.104
0.97 3.102
0.96 3.101
Run Code Online (Sandbox Code Playgroud)
这是我试过的
data_set = [
{'Active rate': [0.98, 0.931588, 0.941192]},
{'Operating Expense': [3.104, 2.352, 2.304]}
]
import csv
with open('names.csv', 'w') as csvfile:
fieldnames = ['Active rate', 'Operating Expense']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'Active rate': 0.98, 'Operating Expense': 3.102})
writer.writerow({'Active rate': 0.97, 'Operating Expense': 3.11})
writer.writerow({'Active rate': 0.96, 'Operating Expense': 3.109})
Run Code Online (Sandbox Code Playgroud)
为简洁起见,我将键减少到2,将值列表减少到3.
如何解决这个问题?
谢谢
Run Code Online (Sandbox Code Playgroud)data_set = [ {'Active rate': [0.98, 0.97, 0.96]}, {'Operating Expense': [3.104, 3.102, 3.101]} ]
首先,快速评论一下,您最初的数据结构不一定有意义。您正在使用一系列字典,但每个字典似乎只使用一个键,这似乎违背了其目的。
其他更有意义的数据结构将是这样的(其中每个字典结构都用于一个标签/值对,就像您当前拥有的那样,但至少字典用于告诉标签和值):
data_set = [
{'label': 'Active rate', 'values': [0.98, 0.97, 0.96]},
{'label': 'Operating Expense', 'values': [3.104, 3.102, 3.101]}
]
Run Code Online (Sandbox Code Playgroud)
或者,可能更好的是,它OrderedDict可以为您提供初始数据集的顺序和键/值映射的好处:
from collections import OrderedDict
data_set = OrderedDict()
data_set['Active rate'] = [0.98, 0.97, 0.96]
data_set['Operating Expense'] = [3.104, 3.102, 3.101]
Run Code Online (Sandbox Code Playgroud)
当然,我们并不总是选择我们获得的数据结构,所以我们假设您无法更改它。那么您的问题就变成了交换初始数据集中的行和列的角色的问题。实际上,您想要同时迭代多个列表,对此zip非常有用。
import csv
fieldnames = []
val_lists = []
for d in data_set:
# Find the only used key.
# This is a bit awkward because of the initial data structure.
k = d.keys()[0]
fieldnames.append(k)
val_lists.append(d[k])
with open('names.csv', 'w') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(fieldnames)
for row in zip(*val_lists):
# This picks one item from each list and builds a list.
# The first row will be [0.98, 3.104]
# The second row will be [0.97, 3.102]
# ...
writer.writerow(row)
Run Code Online (Sandbox Code Playgroud)
DictWriter请注意,当您使用时不需要 a zip,因为这意味着您需要重建一个字典而没有任何实际好处。