交换列表中元素的更好方法?

发布于 2021-01-29 15:09:06

我有一堆看起来像这样的列表:

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,而是想使用更高效的工具。也许列表理解?

关注者
0
被浏览
59
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    无需复杂的逻辑,只需通过切片和步骤重新排列列表即可:

    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 = secondsecond = 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]
    

    希望我不要让大家对这个添加的解释感到困惑。如果是这样,请帮助我的更新并使其更好:-)



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看