3

私は次のような辞書を持っています:

mydict = {"foo":[1,2], "bar":[3,4], "asdf":[5,6]}

これをCSVファイルに書き込もうとしています。次のようになります。

foo,bar,asdf
1,3,5
2,4,6

私は最後の1時間を解決策を探すのに費やしました、そして私が見つけた最も近いものはこのようなことをすることを提案しました:

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

これにより、ヘッダーは正常に書き込まれますが、値は書き込まれません。これが私の出力です:

foo,bar,asdf
[1,2]
[3,4]
[5,6]

必要な出力を取得するにはどうすればよいですか?助けていただければ幸いです。ありがとうございました

4

3 に答える 3

9

の代わりにzip(mydict.values())、 を使用しますzip(*mydict.values())。違いは次のとおりです。

>>> zip(mydict.values())
[([1, 2],), ([3, 4],), ([5, 6],)]
>>> zip(*mydict.values())
[(1, 3, 5), (2, 4, 6)]

基本的に、2 番目のバージョンは と同じことを行い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)]

これにはヘッダーが含まれているため、これを渡してヘッダーの呼び出しをwriterows()削除するだけです。writerow()

もちろん、関数にkey引数を指定して、好きな並べ替えを行うことができます。sorted()たとえば、質問と同じ順序を確保するには:

>>> 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)]
于 2013-03-15T19:56:03.820 に答える
0

タブリブを使用しましたか?

私は通常、この用途に tablib を使用します。使い方はとても簡単です: https://pypi.python.org/pypi/tablib/0.9.3

http://docs.python-tablib.org/en/latest/api/

于 2013-03-15T19:52:25.490 に答える