2

簡単なcsvフォーマットを実行するコードを書きましたが、それができるほど良くないことはわかっています。

ここに入力があります

1,a
1,b
1,c
2,d
2,e
3,a
3,d
3,e
3,f

これが私が望む出力です

['1','a','b','c']
['2','d','e']
['3','a','d','e','f']

これは私が書いたコードです

import csv
input = csv.reader(open('book1.csv'))
output = open('output.csv', 'w')
job=[0,0]
for row in input:
    if row[0] == job[1]:
        job.append(row[1])
    else:
        print(job)
        #output.write(",".join(job))
        job[1] = row[0]
        job = [job[0], job[1]]
        job.append(row[1])

これが出力です

[0,0]
[0, '1', 'a', 'b', 'c']
[0, '2', 'd', 'e']

私が持っている質問は次のとおりです

行のelseステートメントを終了するにはどうすればよいですか? また、セットのゼロ番目の要素として 0 を追加する方法を教えてください。また、コードで最後の「ジョブ」セットを出力したいと思います。最後に、このコードを改善するための提案はありますか?

コードをハックするだけでなく、コードをもっと上手に書きたいのでお願いします。どんな回答でも大歓迎です!前もって感謝します

4

2 に答える 2

2

あなたがやろうとしているのは、2 番目の列を最初の列でグループ化することです。Python にはそのためのツールがありますitertools.groupby

groups = itertools.groupby(input, key=operator.itemgetter(0))

(key, group)はタプルを生成する反復子です。ここkeyで、 は行の最初の項目であり、それぞれgroupがグループ内の行の反復子です。

operator.itemgetter 構文と同じことを行い[]ます -- 指定された項目を取得します。operator.itemgetter(0)以下と同じです:

def itemgetter_0(seq_or_mapping):
    return seq_or_mapping[0]

値を抽出してリストを作成するには、次のことができます。

output = [[key] + map(operator.itemgetter(1), group) for key, group in groups]

これは、各リストを で開始し、各行keyから 2 番目の項目を抽出してリストに追加します。

入力例の場合、出力は次のようになります。

[['1', 'a', 'b', 'c'], ['2', 'd', 'e'], ['3', 'a', 'd', 'e', 'f']]
于 2012-05-12T19:29:47.093 に答える
1

「コードを書くのがずっと上手になる」ためには、核心的なコードを書いて理解できるようになるだけでなく、速達などをダイヤルアップする方法を知る必要がありますgroupby

あなたが尋ねた実際の質問に答えるために、コードを機能させるために必要な最小限の変更を次に示します。

import csv
input = csv.reader(open('book1.csv'))
output = open('output.csv', 'w')
job = []
for row in input:
    if not job: # first row in input file
        job = row
    elif row[0] == job[0]:
        job.append(row[1])
    else:
        print(job)
        #output.write(",".join(job))
        job = row
if job: # emit the last job (if any)
    print(job)
于 2012-05-12T23:17:11.093 に答える