最好的方法是:
>>> replace2([1, 2, 3, 4, 5, 6])
[2, 1, 4, 3, 6, 5]
答案 0 :(得分:8)
def replace2inplace(lst):
lst[1::2], lst[::2] = lst[::2], lst[1::2]
这使用切片分配和切片步长来交换列表中的每一对,就地:
>>> somelst = [1, 2, 3, 4, 5, 6]
>>> replace2inplace(somelst)
>>> somelst
[2, 1, 4, 3, 6, 5]
否则你可以使用一些itertools
技巧:
from itertools import izip, chain
def replace2copy(lst):
lst1, lst2 = tee(iter(lst), 2)
return list(chain.from_iterable(izip(lst[1::2], lst[::2])))
给出:
>>> replace2([1, 2, 3, 4, 5, 6])
[2, 1, 4, 3, 6, 5]
list()
调用可选;如果你只需要循环结果,那么生成器就足够了:
from itertools import izip, chain, islice, tee
def replace2gen(lst):
lst1, lst2 = tee(iter(lst))
return chain.from_iterable(izip(islice(lst1, 1, None, 2), islice(lst2, None, None, 2)))
for i in replace2gen([1, 2, 3, 4, 5, 6]):
print i
其中replace2gen()
也可以使用任意迭代器。
答案 1 :(得分:0)
不合适的版本:
def replace2(lst):
return [x for pair in zip(lst[1::2], lst[::2]) for x in pair]
答案 2 :(得分:0)
我的选择:
x = range(1,7)
res = [e for e in itertools.chain(*zip(x[1::2],x[0::2]))]
答案 3 :(得分:0)
>>> a = [1, 2, 3, 4, 5, 6]
>>> sum([[x+1,x] for x in a if x&1 == True],[])
[2, 1, 4, 3, 6, 5]
编辑:要求进一步解释:
代码逐步执行列表a
中的每个元素,如果元素为奇数(x&1 == True
),它会以相反的顺序将该元素和下一个元素放入列表中{{1} })。
没有我们的[x+1,x]
功能
sum(...,[])
[[2, 1], [4, 3], [6, 5]]
函数删除了给出
sum(...,[])
这可以通过使用列表的索引而不是其值来更一般地完成:
[2, 1, 4, 3, 6, 5]
但是,如果列表的长度不均匀,这将删除列表的最后一个元素。