1

test.txtこの形式のデータを含むテキストファイルがあります

....
a|b|c|d|e
a1|b2|c3|d4|e5
a3|b5|c2|d1|e3
....

各列の値をリストに取得したい: このようなもの

list1=[a,a1,a3]
list2=[b,b2,b5]

私はこれを行うことでこれを成し遂げることができました:

list1,list2,list3,list4,list5 = ([] for i in range(5))

for line in open('test.txt','r'):
    temp=line.split('|')
    list1.append(temp[0])
    list2.append(temp[1])
    list3.append(temp[2])
    list4.append(temp[3])
    list5.append(temp[4].strip())

各リストに値を追加するより短い方法はありますか? 上記のように、リストごとに1行しか考えられません。

4

2 に答える 2

2

zip()あなたの友達はここにいます:

list1, list2, list3, list4, list5 = zip(
    *(line.strip().split('|') for line in open('test.txt')))

追加のボーナスとして、列の数がわからない場合でもこれを使用できます。代わりに単一の変数に割り当てるだけで、各項目が列の値であるリストが得られます:

column_values = zip(*(line.strip().split('|') for line in open('test.txt')))
# column_values[0] is [a,a1,a3] ...

これを少し進めてみましょう。まず、zip()ビットだけで何が起こるかを見てみましょう。

list1, list2, list3, list4, list5 = zip(
    [0,1,2,3,4], [0,1,2,3,4], [0,1,2,3,4])

list1 = [0,0,0]これは、各リストから最初の要素を取得し、結果zip()の最初の要素としてリストに入れるためです。


では、どのようにしzip(a,b,c)てシーケンスから取得するの[a,b,c]でしょうか? 簡単です:*位置引数展開演算子を使用します。zip(*L)と同じzip(L[0], L[1], ...)です。


最後に、渡す必要があるリストのリストを取得するにはどうすればよいでしょうか? ジェネレーター式を使用します。

(line.strip().split('|') for line in open('test.txt'))

一度に1行ずつ、各行の項目のリストを生成するジェネレータを作成します(そして項目から空白を取り除きます)。これはまさに、私たちがzip()望む結果を得るためにフィードする必要があるものです。

于 2013-06-17T02:25:17.220 に答える
0

リストのリストを使用できます。

table = [[] for i in range(5)]

with open('test.txt', 'r') as handle:
    for line in handle:
        for index, value in enumerate(line.strip().split('|')):
            table[index].append(value)

したがって、、などの代わりに、、、などlist1list2セルにアクセスするだけです。table[0][0]table[2][1]

于 2013-06-17T02:24:39.097 に答える