旋转列表清单

时间:2018-11-10 20:06:45

标签: python

m = [[5,9,1,8],
    [2,4,5,7],
    [6,3,3,2],
    [1,7,6,3]]

    rotated_map = []
    for i in range(len(m[0])):
      rotated_map.append([x[i] for x in m]) 
      print(rotated_map)

    """
    my result = [[5, 2, 6, 1], [9, 4, 3, 7], [1, 5, 3, 6], [8, 7, 2, 3]]

    desired result = [[8,7,2,3],
                      [1,5,3,6],
                      [9,4,3,7],
                      [5,2,6,1]]
    """

我正在尝试通过将列表中的所有最后一个元素放到一个列表中,然后将倒数第二个元素放到另一个列表中,以此类推,直到到达第一个元素,以旋转列表。

3 个答案:

答案 0 :(得分:2)

Transpose使用zip的列表,然后使用[::-1]语法reverse

>>> m = [[5, 9, 1, 8], [2, 4, 5, 7], [6, 3, 3, 2], [1, 7, 6, 3]]
>>> list(map(list, zip(*m)))[::-1]
>>> [[8, 7, 2, 3], [1, 5, 3, 6], [9, 4, 3, 7], [5, 2, 6, 1]]

编辑:

如果要漂亮地打印,一路使用numpy数组可能是最简单的。

>>> import numpy as np
>>> 
>>> m = [[5, 9, 1, 8], [2, 4, 5, 7], [6, 3, 3, 2], [1, 7, 6, 3]]
>>> m = np.array(m)
>>> m
>>> 
array([[5, 9, 1, 8],
       [2, 4, 5, 7],
       [6, 3, 3, 2],
       [1, 7, 6, 3]])
>>> 
>>> m.T[::-1]
>>> 
array([[8, 7, 2, 3],
       [1, 5, 3, 6],
       [9, 4, 3, 7],
       [5, 2, 6, 1]])

请注意,mm.T[::-1]共享相同的数据,因为m.T[::-1]只是m的另一个视图。如果您需要复制数据,请使用

result = m.T[::-1].copy()

答案 1 :(得分:1)

您可以使用zip,使用*解压缩列表列表,并使用[::-1]反转结果:

m = [[5,9,1,8],
    [2,4,5,7],
    [6,3,3,2],
    [1,7,6,3]]

res = [list(i) for i in zip(*m)][::-1]

>>> res
[[8, 7, 2, 3], [1, 5, 3, 6], [9, 4, 3, 7], [5, 2, 6, 1]]

如果选择numpy,则移调会更容易:

import numpy as np
>>> np.transpose(m)[::-1]
array([[8, 7, 2, 3],
       [1, 5, 3, 6],
       [9, 4, 3, 7],
       [5, 2, 6, 1]])
# or:
>>> np.flip(np.transpose(m),0)
array([[8, 7, 2, 3],
       [1, 5, 3, 6],
       [9, 4, 3, 7],
       [5, 2, 6, 1]])

答案 2 :(得分:0)

您可以使用numpy模块来执行此操作。它具有转置数组的属性。检查以下代码:

import numpy as np
m = [[5,9,1,8],
    [2,4,5,7],
    [6,3,3,2],
    [1,7,6,3]]
arr = np.array(m).transpose()
new_list = []
for i in range(arr.shape[0]-1,-1,-1):
    new_list.append(list(arr[i]))

print(new_list)

输出:

[[8, 7, 2, 3], [1, 5, 3, 6], [9, 4, 3, 7], [5, 2, 6, 1]]