2016-08-28 5 views
0

さまざまな長さの行(実際には12まで)を入力としてCSVファイルを取得してから、新しい行を構成する新しいCSVファイルを出力する方法 各行の0番目の要素+各ユニークな要素のペア(> 0番目)をアルファベット順に並べます。Pythonで最初の要素を一定に保ちながらアルファベット順にCSV要素をペアにする

元の行要素はアルファベット順ではありません。

入力と出力の例を参照してください。 enter image description here

答えて

1

あなたはペアを生成するための&書き込みとitertools.combinationsを読み取るためcsvを使用することができます。

import csv 
from itertools import combinations 

with open('input.csv') as in_f, open('output.csv', 'w') as out_f: 
    reader = csv.reader(in_f) 
    writer = csv.writer(out_f) 

    for row in reader: 
     for combination in combinations(sorted(row[1:]), 2): 
      writer.writerow(tuple(row[:1]) + combination) 

出力:

0,A,B 
1,A,B 
1,A,C 
1,B,C 
2,A,B 
2,A,C 
2,A,D 
2,B,C 
2,B,D 
2,C,D 
+0

おかげで@niemmi! 私はpython 3.5を使用していますので、 に改行パラメータを追加する必要があります。( 'output.csv'、 'w'、newline = '')out_fとして 、そうでなければoutput.csvファイルに行間に空の行があります また、TypeErrorを取得していました。バイトのようなオブジェクトが必要です。 'str'ではありません したがって、オープンステートメントでは 'w'と 'r'のみ使用しました。 ユニークなペアはアルファベット順ではありませんが、すべてが機能しています。 – WhyNot

+0

@WhyNot:出力ファイルモードを 'wb'から' w'に変更するとうまくいくはずです。 Python 2.7で元の応答をテストしましたが、動作が少し違っていましたが、今や答えを更新して3.4でテストしました。私は3.5が3.4と比べて異なるとは思っていません。 – niemmi

+0

それは完全に動作します。アルファベット順は大文字を小文字の手前に置くため、「ゼブラ」は「リンゴ」の前に並べられます。これは私の混乱でした。もう一度おねがいします@ニームミ – WhyNot

関連する問題