Python列表:用第(n + 1)个交换每第n个值

use*_*982 1 python list

做这个的最好方式是什么:

>>> replace2([1, 2, 3, 4, 5, 6])
[2, 1, 4, 3, 6, 5]
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 8

def replace2inplace(lst):
    lst[1::2], lst[::2] = lst[::2], lst[1::2]
Run Code Online (Sandbox Code Playgroud)

这使用切片分配和切片步长来就地交换列表中的每一对:

>>> somelst = [1, 2, 3, 4, 5, 6]
>>> replace2inplace(somelst)
>>> somelst
[2, 1, 4, 3, 6, 5]
Run Code Online (Sandbox Code Playgroud)

否则你可以使用一些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])))
Run Code Online (Sandbox Code Playgroud)

这使:

>>> replace2([1, 2, 3, 4, 5, 6])
[2, 1, 4, 3, 6, 5]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

哪里replace2gen()也可以采用任意迭代器.