追加到Python中行/列长度未知的二维列表

发布于 2024-12-11 15:30:16 字数 466 浏览 0 评论 0 原文

我想要翻转二维列表上的行和列,但遇到了麻烦。 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:列表分配索引超出范围”错误。我可以循环两次,第一次计算列和行,然后初始化网格,然后再次循环并赋值,但这似乎非常浪费。

我对 Python 还很陌生,并且认为有一种我缺少的简单方法可以做到这一点。

感谢您的帮助。

I am looking to flip the rows and columns on a 2D list and am running into trouble. Python won't allow a value to be assigned to an uninitialized 'cell'. I am not sure how to initialize my grid since I don't know the length ahead of time. The following:

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

fails with a "IndexError: list assignment index out of range" error. I could loop through twice, the first time to count columns and rows, than initialize the grid, than loop again and assign values, but that seems awfully wasteful.

I am pretty new to Python and figure there is a simple way to do this that I am missing.

Thanks for the help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

请恋爱 2024-12-18 15:30:16

这是与 @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])

Here's an EAFP counterpoint to @retracile's LBYL approach.

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])
玩世 2024-12-18 15:30:16

假设所有行的长度相等,您可以这样处理:

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)

Assuming all rows of equal length, you can approach it like this:

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)
泪眸﹌ 2024-12-18 15:30:16

这应该可以:

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))

This should do:

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

Though, zip gives a list of tuples. If you need a list of lists you can do either of these:

data = [list(x) for x in zip(*maReader)]
data = map(list, zip(*maReader))
北凤男飞 2024-12-18 15:30:16

如果所有行的长度相等,则 data = zip(*maReader) 应该这样做。
如果不是:

from itertools import izip_longest

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

另请参阅Python 中的矩阵转置

if all rows of equal length then data = zip(*maReader) should do it.
If not:

from itertools import izip_longest

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

See also Matrix Transpose in Python.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文