我知道如何将两个变量交换在一起,但我想知道是否有更快的方法来遵循某种模式。
所以我有这个号码列表。 list=[1,2,3,4,5,6]
我想要做的是交换一个数字与下一个数字交换下一个数字后面的数字。所以在交换它们之后它会变成list=[2,1,4,3,6,3]
所以我想知道是否有办法能够更简单地交换数字。谢谢。
答案 0 :(得分:8)
lst = [1,2,3,4,5,6] # As an example
for x in range(0, len(lst), 2):
if x+1 == len(lst): # A fix for lists which have an odd-length
break
lst[x], lst[x+1] = lst[x+1], lst[x]
这不会创建新列表。
编辑:经过测试,它甚至比列表理解更快。
答案 1 :(得分:2)
如果您的列表长度均匀,这可能是最简单的方法:
>>> lst = [1,2,3,4,5,6]
>>> [lst[i^1] for i in range(len(lst))]
[2, 1, 4, 3, 6, 5]
答案 2 :(得分:1)
from itertools import chain
from itertools import izip_longest
In [115]: li
Out[115]: [1, 2, 3, 4, 5, 6, 7]
In [116]: [i for i in list(chain(*(izip_longest(li[1::2],li[0::2])))) if i!=None]
Out[116]: [2, 1, 4, 3, 6, 5, 7]
或者如果你有长度列表
a[start:end:step] # start through not past end, by step
请查看此理解List slice notation
In [65]: li
Out[65]: [1, 2, 3, 4, 5, 6]
In [66]: new=[None]*(len(li))
In [71]: new[0::2]=li[1::2]
In [73]: new[1::2]=li[0::2]
In [74]: new
Out[74]: [2, 1, 4, 3, 6, 5]
答案 3 :(得分:1)
我的解决方案使用funcy
示例:强>
>>> from funcy import chunks, mapcat
>>> xs = [1, 2, 3, 4, 5, 6]
>>> ys = mapcat(reversed, chunks(2, xs))
>>> ys
[2, 1, 4, 3, 6, 5]
这种类型的读取也很好;连接并映射反转xs
的每个2对块的结果。