使用2d列表,例如:
[['G', 'Y', 'V', 'X'], ['C', 'F', 'Z', 'Y'], ['B', 'X', 'B', 'J'], ['P', 'T', 'U', 'W']]
是否有允许交换的BIF /速记,如下面的示例所示,每个内部列表的每个第0个索引都已与内部列表的第2个索引交换:
[['V', 'Y', 'G', 'X'], ['Z', 'F', 'C', 'Y'], ['B', 'X', 'B', 'J'], ['U', 'T', 'P', 'W']]
我已经制作了一个工作正常的迭代解决方案。但是知道BIF是否存在会很高兴。提前致谢。
答案 0 :(得分:3)
如果您想进行交换(我假设),我会这样:
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']]
我不知道任何整洁的oneliner是可读的并且可以解决问题。
答案 1 :(得分:3)
你的问题的答案是否定的,没有有效的oneliner会像使用for循环和sub[0],sub[2] = sub[2],sub[0]
那样交换元素,如果你想要一个oneliner并且你需要切换原始列表:
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)