如何在python中反转2d列表

2024-05-16 07:10:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个这样的二维列表:

   1   2   3

   4   5   6

我想说:

   1   4

   2   5

   3   6

我试着做一个for循环并切换每个值,但是我总是得到一个索引越界错误。以下是我所拥有的:

for i in results:
    for j in range(numCenturies):
        rotated[i][j] = results [j][i]

Tags: in列表for错误rangeresultsrotated越界
3条回答

从有关zip函数的python文档中:

This function returns a list of tuples, where the i-th tuple contains the i-th element from each of the argument sequences or iterables. The returned list is truncated in length to the length of the shortest argument sequence. When there are multiple arguments which are all of the same length, zip() is similar to map() with an initial argument of None. With a single sequence argument, it returns a list of 1-tuples. With no arguments, it returns an empty list.

示例:

zip([1, 2, 3], [4, 5, 6]) # returns [(1, 4), (2, 5), (3, 6)]

如果需要结果是列表列表,而不是元组列表,则可以使用列表理解:

[list(x) for x  in zip([1, 2, 3], [4, 5, 6], [7, 8, 9])] # returns [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

如果所有变量都存储在一个2d列表中,并且希望将其传递到zip函数中,则可以使用以下方法(我将其称为星号,因为我记不起它的正确英文术语):

results = [[1, 2, 3], [4, 5, 6]]
zip(*results) # returns [(1, 4), (2, 5), (3, 6)]

http://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html

>>> from numpy import transpose
>>> transpose([[1,2,3],[4,5,6]])
array([[1, 4],
       [2, 5],
       [3, 6]])

zip是正确的方法,如aga所示。

但如果你想知道为什么你的原始代码不起作用:

for i in results:
    for j in range(numCenturies):
        rotated[i][j] = results [j][i]

这里有两个明显的问题,可能还有另外两个。(因为您没有向我们展示足够的代码或数据来确定,所以我无法保证这两个可能的代码或数据。)

可能results看起来像这样:

results = [[1, 2, 3], [4, 5, 6]]

当你做for i in results时,这意味着i将是结果中的每个元素,也就是说,它将是[1, 2, 3],然后是[4, 5, 6]。不能将列表用作列表的索引,因此这保证会给您一个TypeError: list indices must be integers, not list

要解决此问题,您需要:

for i in range(len(results)):

……或者

for i, row in enumerate(results):

接下来,results[j][i]保证提高IndexError: list index out of range,因为i是每个数,但您试图将其用作数。如果在results的行和列上迭代,则需要:

rotated[j][i] = results[i][j]

接下来,除非用3个列表预先填充rotated,每个列表都预先填充了2个某种类型的对象,否则将得到IndexError: list assignment index out of range

要解决此问题,需要预先填充rotated,如下所示:

rotated = [[None for j in range(2)] for i in range(3)]

……或者

rotated = [[None, None], [None, None], [None, None]]

最后,我敢打赌numCenturies是3,在这种情况下,只要j到达2就可以得到另一个IndexError: list index out of range。在这里,最简单的方法就是使用行的长度;这样就不可能出现一次性错误。

总而言之:

rotated = [[None for j in range(2)] for i in range(3)]
for i, row in enumerate(results):
    for j, value in enumerate(row):
        rotated[j][i] = value

但一般来说,Python提供了比预先创建数组和循环索引来填充值更简单的方法。您可以使用append-或者更好的是,使用列表理解。或者,更好的是,找到一种更高级的方法来编写您的使用,比如对zip的单个调用。

相关问题 更多 >