交换二维列表的列

Swapping Columns of 2D List

使用二维列表,例如:

[['G', 'Y', 'V', 'X'], ['C', 'F', 'Z', 'Y'], ['B', 'X', 'B', 'J'], ['P', 'T', 'U', 'W']]

是否有允许交换的 BIF/shorthand,如下例所示,每个内部列表的第 0 个索引已与内部列表的第 2 个索引交换:

[['V', 'Y', 'G', 'X'], ['Z', 'F', 'C', 'Y'], ['B', 'X', 'B', 'J'], ['U', 'T', 'P', 'W']]

我制作了一个迭代解决方案,效果很好。但很高兴知道 BIF 是否确实存在。提前致谢。

如果你想就地交换(我假设),我会这样:

def swap_in(lst, fro, to):
    lst[fro], lst[to] = lst[to], lst[fro]

lst = [['G', 'Y', 'V', 'X'], ['C', 'F', 'Z', 'Y'], ['B', 'X', 'B', 'J'], ['P', 'T', 'U', 'W']]

for sublist in lst:
    swap_in(sublist, 0, 2)

print(lst) # [['V', 'Y', 'G', 'X'], ['Z', 'F', 'C', 'Y'], ['B', 'X', 'B', 'J'], ['U', 'T', 'P', 'W']]

我不知道有任何简洁的单行本可以阅读并且可以解决问题。

你的问题的答案是否定的,没有像使用 for 循环和 sub[0],sub[2] = sub[2],sub[0] 那样交换元素的高效单行代码,如果你想要一个单行代码并更改原始列表,你将不得不切片:

l = [['G', 'Y', 'V', 'X'], ['C', 'F', 'Z', 'Y'], ['B', 'X', 'B', 'J'], ['P', 'T', 'U', 'W']]

l[:] = [sub[2:3] + sub[1:2] + sub[0:1] + sub[3:] for sub in l]

这会大大降低效率,因为您通过切片创建多个新列表,而不是简单地交换列表中的两个引用。

如果您明确传递了新订单,则可以使用 itemgetter,但这也涉及映射到之后的列表。

l = [['G', 'Y', 'V', 'X'], ['C', 'F', 'Z', 'Y'], ['B', 'X', 'B', 'J'], ['P', 'T', 'U', 'W']]
from operator import itemgetter

l[:] = map(itemgetter(2, 1, 0, 3), l)

print(l)