2011-10-25 10 views
2

2Dリストの行と列を反転させてトラブルに遭っています。 Pythonでは、初期化されていない 'セル'に値を割り当てることができません。私はグリッドをどのように初期化するか分からないので、前もって長さが分からないからです。次のようになります。Pythonで行/列の長さが不明な2Dリストに追加する

data = list() 
maReader = csv.reader(open('TEST.csv', 'rb'), delimiter=',', quotechar='"') 
for rindex, row in enumerate(maReader): 
    for iindex, item in enumerate(row): 
     data[iindex][rindex] = item 

"IndexError:リスト割り当てインデックスが範囲外です"というエラーで失敗します。私は2回ループすることができます。最初に列と行を数えます。グリッドを初期化するよりも、ループを繰り返して値を代入するよりも、無駄になります。

私はPythonにはかなり新しく、これを行う簡単な方法があります。欠落しています。

ありがとうございました。あなたはこのようにそれに近づくことができ、同じ長さのすべての行を想定し

答えて

3

はここで@ retracileのLBYLアプローチにEAFP対位法です。

data = [] #list() 
maReader = csv.reader(open('TEST.csv', 'rb'), delimiter=',', quotechar='"') 
for rindex, row in enumerate(maReader): 
    for iindex, item in enumerate(row): 
     try: 
      data[iindex].append(item) 
     except IndexError: 
      data.append([item]) 
+0

最初の行だけが例外に当たるので、このアプローチはおそらく私の場合よりも速いでしょう。 – retracile

+0

パーフェクト、これは動作します。ありがとうございました! – user1013550

2

data = list() 
maReader = csv.reader(open('TEST.csv', 'rb'), delimiter=',', quotechar='"') 
for rindex, row in enumerate(maReader): 
    for iindex, item in enumerate(row): 
     if len(data) <= iindex: 
      data.append([]) 
     data[iindex].append(item) 
2

これが何をすべき:

maReader = csv.reader(open('TEST.csv', 'rb'), delimiter=',', quotechar='"') 
data = zip(*maReader) 

ものの、zipはタプルのリストを与えます。あなたがリストのリストが必要な場合は、これらのいずれかの操作を行うことができます

data = [list(x) for x in zip(*maReader)] 
data = map(list, zip(*maReader)) 
+0

私はもっと良い方法がありましたが、私の脳はうまく機能しませんでした。 +1 – retracile

1

等しい長さのすべての行がdata = zip(*maReader)の場合はそれを実行する必要があります。 ない場合:

from itertools import izip_longest 

list(izip_longest(*f, fillvalue='')) 

Matrix Transpose in Pythonを参照してください。

関連する問題