我只是在玩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显然不是这种情况下的选择问题,而是找到可获得此类信息的任何资源。
答案 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)