在Python中向未知行列长度的二维列表添加元素
我想把一个二维列表的行和列互换,但遇到了一些问题。Python不允许给一个还没有初始化的“单元格”赋值。我不太确定该如何初始化我的网格,因为我事先不知道它的长度。下面这段代码:
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: list assignment index out of range”的错误。我可以先循环两次,第一次用来计算行和列的数量,然后初始化网格,再循环一次来赋值,但这样做似乎太浪费时间了。
我对Python还很陌生,觉得应该有更简单的方法来做到这一点,但我还没找到。
谢谢大家的帮助。
4 个回答
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))
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])