将字典列表写入CSV Python

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.

如何解决这个问题?

谢谢

Bru*_*uno 2

data_set = [
    {'Active rate': [0.98, 0.97, 0.96]},
    {'Operating Expense': [3.104, 3.102, 3.101]}
]
Run Code Online (Sandbox Code Playgroud)

首先,快速评论一下,您最初的数据结构不一定有意义。您正在使用一系列字典,但每个字典似乎只使用一个键,这似乎违背了其目的。

其他更有意义的数据结构将是这样的(其中每个字典结构都用于一个标签/值对,就像您当前拥有的那样,但至少字典用于告诉标签和值):

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,因为这意味着您需要重建一个字典而没有任何实际好处。