交换列表中元素的更好方法?
我有一堆看起来像这样的列表:
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
我想交换元素如下:
final_l = [2, 1, 4, 3, 6, 5, 8, 7, 10, 9]
列表的大小可能有所不同,但是它们将始终包含偶数个元素。
我对Python相当陌生,目前正在这样做:
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
final_l = []
for i in range(0, len(l)/2):
final_l.append(l[2*i+1])
final_l.append(l[2*i])
我知道这不是真正的Pythonic,而是想使用更高效的工具。也许列表理解?
-
无需复杂的逻辑,只需通过切片和步骤重新排列列表即可:
In [1]: l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] In [2]: l[::2], l[1::2] = l[1::2], l[::2] In [3]: l Out[3]: [2, 1, 4, 3, 6, 5, 8, 7, 10, 9]
TLDR;
编辑带说明
我相信大多数观众已经熟悉列表切片和多重分配。如果您不这样做,我会尽力解释发生了什么(希望我不会让情况更糟)。
要了解列表切片,这里已经有一个很好的答案和列表切片符号的说明。简单的说:
a[start:end] # items start through end-1 a[start:] # items start through the rest of the array a[:end] # items from the beginning through end-1 a[:] # a copy of the whole array There is also the step value, which can be used with any of the above: a[start:end:step] # start through not past end, by step
让我们看一下OP的要求:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # list l ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 0 1 2 3 4 5 6 7 8 9 # respective index of the elements l[0] l[2] l[4] l[6] l[8] # first tier : start=0, step=2 l[1] l[3] l[5] l[7] l[9] # second tier: start=1, step=2 ----------------------------------------------------------------------- l[1] l[3] l[5] l[7] l[9] l[0] l[2] l[4] l[6] l[8] # desired output
第一层将是:
l[::2] = [1, 3, 5, 7, 9]
第二层将是:l[1::2] = [2, 4, 6, 8, 10]
由于我们要重新分配
first = second
&second = first
,因此可以使用多个分配,并就地更新原始列表:first , second = second , first
那是:
l[::2], l[1::2] = l[1::2], l[::2]
附带说明一下,要获取新列表而不更改原始列表
l
,我们可以从分配一个新列表l
,然后执行上面的操作,即:n = l[:] # assign n as a copy of l (without [:], n still points to l) n[::2], n[1::2] = n[1::2], n[::2]
希望我不要让大家对这个添加的解释感到困惑。如果是这样,请帮助我的更新并使其更好:-)