2011-10-25 120 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:列表分配索引超出範圍」錯誤而失敗。我可以循環兩次,第一次對列和行進行計數,而不是初始化網格,而不是循環再次分配值,但這看起來非常浪費。

我對Python很新,圖中有一個簡單的方法來做到這一點,我失蹤了。

感謝您的幫助。

回答

3

下面是一個EAFP對位@ retracile的LBYL方法。

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