转置列表清单

时间:2017-12-27 17:48:54

标签: python python-3.x

我只是在玩python以更深入地理解这些内容。

我了解到更简单的方法之一就是使用zip,但是如何:

>>> a = [[1,1,1], [2,2,2], [3,3,3]]
>>> for i in range(len(a)):
...   for j in range(len(a[0])):
...     a[i][j], a[j][i] = a[j][i], a[i][j]
... 
>>> a
[[1, 1, 1], [2, 2, 2], [3, 3, 3]]
>>> 
好吧,我期待答案是

[[1, 2, 3], [1, 2, 3], [1, 2, 3]]

因为这就是Transpose会是什么?我交换了元素,对吧? 而且,这种方式对我来说更自然。我阅读了zip here的文档,并没有提到任何有关此类“技巧”的内容。如何学习这些更加pythonic的做事方式?我知道要求学习资源会产生主观选择,因此不鼓励这样的问题。但IMO显然不是这种情况下的选择问题,而是找到可获得此类信息的任何资源。

3 个答案:

答案 0 :(得分:11)

您将l[0][1]l[1][0]交换...然后当您到达l[1][0]时,您将l[1][0]l[0][1]交换。除了对角线元素之外,每对元素都被交换两次,但无论如何都要与它们交换。一切都在它开始的地方结束。

如果您想通过元素交换执行转置,则需要避免交换两次:

for i in range(len(a)):
    for j in range(i+1, len(a)):
        a[i][j], a[j][i] = a[j][i], a[i][j]

此外,您的转置隐式假设平方输入。如果您获得3x5输入,则无法与a[2][4]交换a[4][2],因为没有a[4][2]

答案 1 :(得分:1)

你也可以在这里使用基本列表理解:

a = [[1,1,1], [2,2,2], [3,3,3]]

transposed = [[x[i] for x in a] for i in range(len(a[0]))]

print(transposed)
# [[1, 2, 3], [1, 2, 3], [1, 2, 3]]

答案 2 :(得分:0)

问题是你在循环期间覆盖a,这样在第一次转置操作之后,第二次只是撤消第一次。

您可以复制a(而不是覆盖a),也可以通过列表理解来复制。

import copy
a = [[1,1,1], [2,2,2], [3,3,3]]
a2  = copy.deepcopy(a)
for i in range(len(a)):
  for j in range(len(a[0])):
    a2[i][j] = a[j][i]

a3 = [[a[j][i] for j, _ in enumerate(ai)] for i, ai in enumerate(a)]

print(a)
print(a2)
print(a3)