如何在python中反转2d列表

时间:2013-11-29 05:44:33

标签: python list invert

我有一个像这样的二维名单:

   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]

3 个答案:

答案 0 :(得分:12)

来自zip函数的python文档:

  

此函数返回元组列表,其中第i个元组包含来自每个参数序列或迭代的第i个元素。返回的列表的长度被截断为最短参数序列的长度。当有多个参数长度相同时,zip()类似于map(),初始参数为None。使用单个序列参数,它返回一个1元组的列表。没有参数,它返回一个空列表。

示例:

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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]

接下来,除非您预先填充rotated 3个列表,其中每个列表预先填充了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,在这种情况下,只要IndexError: list index out of range到达j,您就会得到另一个2。这里最简单的方法就是使用行的长度;这种方式没有出现一个一个错误的可能性。

全部放在一起:

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