Python 将多个词典写入csv文件?

Python 将多个词典写入csv文件?,python,csv,dictionary,Python,Csv,Dictionary,多亏了这另一个线程,我作为一个使用Python的初学者成功地将字典编写成了csv: csv如下所示: 024.7548 1 34.2422 2 19.3290 现在,我想知道用相同的键组织多个词典的最佳方法是什么。我希望将键作为第一列,然后将dict值放在其后的列中,所有这些都具有第一行,以便通过字典名称来区分列 当然,有很多线程试图做类似的事情,比如:,但是我的数据结构没有相同的方式(但是…)。也许必须先合并词典 dict2 = {0 : 13.422, 1 : 9.2308, 2 :

多亏了这另一个线程,我作为一个使用Python的初学者成功地将字典编写成了csv:

csv如下所示:

024.7548
1  34.2422
2  19.3290
现在,我想知道用相同的键组织多个词典的最佳方法是什么。我希望将键作为第一列,然后将dict值放在其后的列中,所有这些都具有第一行,以便通过字典名称来区分列

当然,有很多线程试图做类似的事情,比如:,但是我的数据结构没有相同的方式(但是…)。也许必须先合并词典

dict2 = {0 : 13.422, 1 : 9.2308, 2 : 20.132}
dict3 = {0 : 32.2422, 1 : 23.342, 2 : 32.424}
我的理想输出:

ID dict1 dict2 dict3
0   24.7548  13.422   32.2422
1   34.2422  9.2308   23.342
2   19.3290  20.132   32.424

我还不确定键名的列名
ID
将如何在那里工作。

我已经有一段时间没有使用Python了,但我的建议如下。 在Python中,字典值可以是任何类型(据我所知,如果我错了,请不要批评我)。至少应该可以将键映射到列表

因此,您可以在字典上循环,并可能创建一个新的字典“d”,对于每个键,如果值已经在“d”中,则将该值推送到“d”值(因为关联键的值是一个列表)

然后你可以把新字典写成:(伪代码) 对于每个键,字典中的值 写密钥 写入选项卡 每v值 写入v+选项卡 写新行 结束

虽然这不包括“标题名”,但我相信这很容易添加。

使用
defaultdict(列表)

这就是你得到的:

{0: [24.7548, 13.422, 32.2422], 1: [34.2422, 9.2308, 23.342], 2: [19.329, 20.132, 32.424]})

然后将
merged\u dict
写入csv文件,就像您以前对单个dict所做的那样。这次
writerow
方法将有助于
csv
模块。

这里有一种方法

my_dicts = [dict1, dict2, dict3]
dict_names = range(1, len(my_dicts)+1)
header = "ID," + ",".join(map(lambda x: "dict"+str(x)), dict_names) + "\n"
all_possible_keys = set(reduce(lambda x,y: x + y.keys(), my_dicts, []))

with open("file_to_write.csv", "w") as output_file:
    output_file.write(header)
    for k in all_possible_keys:
        print_str = "{},".format(k)
        for d in my_dicts:
            print_str += "{},".format(d.get(k, None))
        print_str += "\n"
        output_file.write(print_str)

使用csv模块和列表理解:

import csv

dict1 = {0: 33.422, 1: 39.2308, 2: 30.132}
dict2 = {0: 42.2422, 1: 43.342, 2: 42.424}
dict3 = {0: 13.422, 1: 9.2308, 2: 20.132}
dict4 = {0: 32.2422, 1: 23.342, 2: 32.424}

dicts = dict1, dict2, dict3, dict4

with open('my_data.csv', 'wb') as ofile:
    writer = csv.writer(ofile, delimiter='\t')
    writer.writerow(['ID', 'dict1', 'dict2', 'dict3', 'dict4'])
    for key in dict1.iterkeys():
        writer.writerow([key] + [d[key] for d in dicts])
请注意,字典在默认情况下是无序的,因此如果希望键按升序排列,则必须对键进行排序:

for key in sorted(dict1.iterkeys(), key=lambda x: int(x)):
    writer.writerow([key] + [d[key] for d in dicts])
如果您需要处理无法确保所有dict都具有相同键的情况,则需要更改一些小内容:

with open('my_data.csv', 'wb') as ofile:
    writer = csv.writer(ofile, delimiter='\t')
    writer.writerow(['ID', 'dict1', 'dict2', 'dict3', 'dict4'])
    keys = set(d.keys() for d in dicts)
    for key in keys:
        writer.writerow([key] + [d.get(key, None) for d in dicts])

如果每个
dict
键不存在,理解将失败。这对海报来说可能不是问题,但需要注意的是。您可以使用
defaultdict
或覆盖
\uuuu missing\uuu
的自定义类来代替
dict
s,但只要尝试访问
dicts
中的每个
d
d[键]
,就会引发
键错误,这取决于。如果预期所有dict都包含所有键,则默认dict不正确。@如果需要处理可能丢失的条目,请使用d.
get(key,None)
这是一种处理它们的方法,如果您只想交换一个sentinel值<代码>\uuuu缺失\uuuu
让您可以做更多的事情。
for key in sorted(dict1.iterkeys(), key=lambda x: int(x)):
    writer.writerow([key] + [d[key] for d in dicts])
with open('my_data.csv', 'wb') as ofile:
    writer = csv.writer(ofile, delimiter='\t')
    writer.writerow(['ID', 'dict1', 'dict2', 'dict3', 'dict4'])
    keys = set(d.keys() for d in dicts)
    for key in keys:
        writer.writerow([key] + [d.get(key, None) for d in dicts])