在Python中向未知行列长度的二维列表添加元素

2 投票
4 回答
3551 浏览
提问于 2025-04-17 05:00

我想把一个二维列表的行和列互换,但遇到了一些问题。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])

撰写回答