1

これまでのところ、リストのマージに関する質問しか見つかりませんでした。

3 つのリスト (2 つのリストと 1 つの 2D リスト) を取得しようとしています。

list1 = [[1,11,12],[2,21,22],[3,31,32]]
list2 = [4,5,6]
list3 = [7,8,9]

これらの値を CSV ファイルに書き込むと、 //必要な出力が得られます。

Row1,Row2,Row3 
1,4,7 
2,5,8
3,6,9

11、12 などは CSV ファイルに書き込まないでください。

コード:

f = open('file.csv', 'wb')
fileWriter = csv.writer(f)
fileWriter.writerow(['Row1', 'Row2', 'Row3']) # Write header row

試み:

listlen = len(list2)
list1len = len(list1)

for i in range(listlen):
    for j in range(listlen):
        for k in range(list1len):
            fileWriter.writerow([list1[k][0],list2[i],list3[j]])

結果:

Row1,Row2,Row3
1,4,7
2,4,7
3,4,7

試み:

for A,B,C in list1:
for X in list2:
    for Y in list3:
        tempA = A
        tempX = X
        tempY = Y
        fileWriter.writerow([tempA,tempX,tempY])

結果:

Row1,Row2,Row3
1,4,7
1,4,8
1,4,9
etc. 

現在のコード (両方の試行) は、list1 の 1 桁の値ごとに、list2 と list3 のすべての値を反復処理しています。2 回の試行の間に私が何とかできたのは、書き出された数字の順序を変更することだけです。

私がやりたいのは、各リストの最初の値を書き出し、次に2番目などを書き出して、目的の出力を提供することです。

これを調整して目的の出力を得るにはどうすればよいですか/より良い代替手段はありますか?

Python 2.7 のみ

Abhijit の回答から作成したソリューションを追加しました。

result = zip(zip(*list1)[0], list2, list3)

for row in result:
    tempRow = row
    fileWriter.writerow(tempRow)
4

1 に答える 1

2

csv を記述することを既に認識していると仮定すると、疑問に思うかもしれない部分は、データにアクセスするエレガントな方法です。

データにアクセスする気の利いた方法は、組み込みのzipを使用することです。zip([iterable, ...])データを転置するエレガントな機能があり、ここで必要なもの

>>> zip(zip(*list1)[0], list2, list3)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

残念ながら、検討しているターゲット結果は csv ではなくフォーマットされたデータであるため、csv をタブ区切りで記述していても、望ましい結果が得られない場合があります。

>>> result = [['row1','row2','row3']] + zip(zip(*list1)[0], list2, list3)
>>> with open('file.csv', 'wb') as fin:
    writer = csv.writer(fin, delimiter = '\t')
    writer.writerows(result)

row1    row2    row3
1   4   7
2   5   8
3   6   9

1 つのオプションは、csv の考え方を放棄し、代わりに を使用してフォーマットされた文字列としてデータを書き込むことstr.formatです。

>>> header = ['row1','row2','row3']
>>> result = zip(zip(*list1)[0], list2, list3)
>>> format_string = "{:<10}{:<10}{:<10}"
>>> with open('file.csv', 'wb') as fin:
    fin.write(format_string.format(*header))
    fin.write('\n')
    for row in result:
        fin.write(format_string.format(*row))
        fin.write('\n')


row1      row2      row3      
1         4         7         
2         5         8         
3         6         9     
于 2013-10-09T05:10:41.297 に答える