2011-10-25 95 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