无法将字典写入csv,其中键作为标题,值作为列

Poo*_*thy 2 python csv dictionary

我有一个字典,看起来像:

mydict = {"foo":[1,2], "bar":[3,4], "asdf":[5,6]}
Run Code Online (Sandbox Code Playgroud)

我正在尝试将其写入CSV文件,使其看起来像:

foo,bar,asdf
1,3,5
2,4,6
Run Code Online (Sandbox Code Playgroud)

我花了最后一小时寻找解决方案,而我发现的最接近的解决方案建议做这样的事情:

headers = mydict.keys()
with open("File2.csv","w") as f:
    writer = csv.writer(f)
    writer.writerow(headers)
    writer.writerows(zip(mydict.values())
Run Code Online (Sandbox Code Playgroud)

这会将标头写好,但不会写入值.这是我的输出:

foo,bar,asdf
[1,2]
[3,4]
[5,6]
Run Code Online (Sandbox Code Playgroud)

如何获得我需要的输出?我真的很感激一些帮助.谢谢

And*_*ark 8

而不是zip(mydict.values()),使用zip(*mydict.values()).这是区别:

>>> zip(mydict.values())
[([1, 2],), ([3, 4],), ([5, 6],)]
>>> zip(*mydict.values())
[(1, 3, 5), (2, 4, 6)]
Run Code Online (Sandbox Code Playgroud)

基本上第二个版本的功能与之相同zip([1, 2], [3, 4], [5, 6]).这在文档中称为解包参数列表.

要强制执行排序,请使用以下命令:

>>> zip(*([k] + mydict[k] for k in sorted(mydict)))
[('asdf', 'bar', 'foo'), (5, 3, 1), (6, 4, 2)]
Run Code Online (Sandbox Code Playgroud)

这包括标题,因此只需将其传入writerows()和删除您writerow()对标题的调用.

当然,你可以为那里keysorted()函数提供一个参数来做你喜欢的任何排序.例如,要确保与问题中的订单相同:

>>> order = {'foo': 0, 'bar': 1, 'asdf': 2}
>>> zip(*([k] + mydict[k] for k in sorted(mydict, key=order.get)))
[('foo', 'bar', 'asdf'), (1, 3, 5), (2, 4, 6)]
Run Code Online (Sandbox Code Playgroud)