列表名单的移调

我只是在玩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]] 

,因为这是移调将会 ?我调换了元素,对吧? 另外,这种方式对我来说更自然。我阅读了zip here的文档,并没有提到任何有关这种“技巧”的内容。如何学习这些更pythonic的方式做事情?我知道要求学习资源进入主观选择,所以SO不鼓励这样的问题。但国际海事组织在这种情况下显然不是一个选择问题,而是在可获得这些信息的任何资源中找到。

回答:

你换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]

回答:

问题在于你在循环中覆盖了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)

回答:

你也可以只使用一个基本的列表理解这里:

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

以上是 列表名单的移调 的全部内容, 来源链接: utcz.com/qa/266722.html

回到顶部