因为绝对没有人给出适用于通用迭代的答案,
from itertools import chain
items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
zip(*[iter(items)]*2)
#>>> <zip object at 0x7fd673afd050>
[itms for itms in zip(*[iter(items)]*2)]
#>>> [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
所以zip(*[iter(x)]*2) 表示ix = iter(x); zip(ix, ix) 将每个元素配对。
然后你可以反转:
[(y, x) for (x, y) in zip(*[iter(items)]*2)]
#>>> [(2, 1), (4, 3), (6, 5), (8, 7), (10, 9)]
将它们放在一起并展平:
[itm for (x, y) in zip(*[iter(items)]*2) for itm in (y, x)]
#>>> [2, 1, 4, 3, 6, 5, 8, 7, 10, 9]
它是通用的和短!
如果您想以牺牲通用性为代价获得更快的速度,那么您将很难做到这一点:
new = list(items)
new[::2], new[1::2] = new[1::2], new[::2]
new
#>>> [2, 1, 4, 3, 6, 5, 8, 7, 10, 9]
请注意,这仍然适用于任意迭代,但抽象层更少;您不能轻易增加翻转子列表的大小,也不能输出可迭代对象等。