1

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

>>> replace2([1, 2, 3, 4, 5, 6])
[2, 1, 4, 3, 6, 5]
4

4 回答 4

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

wherereplace2gen()也可以采用任意迭代器。

于 2013-04-09T15:48:20.823 回答
0

异地版本:

def replace2(lst):
    return [x for pair in zip(lst[1::2], lst[::2]) for x in pair]
于 2013-04-09T15:50:54.427 回答
0

我的选择:

x = range(1,7)
res = [e for e in itertools.chain(*zip(x[1::2],x[0::2]))]
于 2013-04-09T15:54:45.673 回答
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),它会将那个元素和下一个元素以相反的顺序 ( ) 放入列表中[x+1,x]

sum(...,[])如果没有我们将拥有的功能

[[2, 1], [4, 3], [6, 5]]

sum(...,[])函数删除给出的内部方括号

[2, 1, 4, 3, 6, 5]

这可以通过使用列表的索引而不是它的值来更普遍地完成:

>>> a = [1, 2, 3, 4, 5, 6]
>>> sum([[a[x],a[x-1]] for x in range(len(a)) if x&1 == True],[])
[2, 1, 4, 3, 6, 5]

但是,如果列表的长度不是偶数,这将删除列表的最后一个元素。

于 2013-04-09T16:08:43.327 回答