当前位置: 首页 > 面试题库 >

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

孙星鹏
2023-03-14
问题内容

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

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

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



 类似资料:
  • 问题内容: 有没有比在Python中交换两个列表元素更快的方法了 还是我不得不求助于Cython或Weave之类? 问题答案: 看起来Python编译器使用此构造优化了临时元组: 码: 输出: 两个加载,一个和两个保存,而三个加载和三个保存。您不太可能找到更快的机制。

  • 我创建了一个元素列表,我想更新其中一个列表元素 这是对update方法的调用: 这是更新方法: 在该方法中,我收到警告“从方法生成函数”,并建议“方法‘update\elem’可能是‘static’” 更新列表元素而不收到警告的正确方法是什么?

  • 问题内容: 我想保持添加到列表中的元素的顺序。因此,我在Java中使用了。 现在,我希望能够交换链接列表中的两个元素。首先,我找不到for 。同样,也无法在指定位置添加元素。 问题答案: 还有一个,你可以用它来交换的两个元素。还有和(都是由指定的方法)。所有这些操作都将因为a 而不是。

  • 问题内容: 我在这样的列表中有一个元组/列表: python(在非常低的cpu / ram机器上运行)交换值的最快方法是什么… 当前使用: 有更好或更快速的方法吗??? 问题答案: 您可以使用地图: 或列表理解: 列表理解是首选方法,并且在需要lambda时,它比map快得多。但是请注意,列表理解具有严格的评估标准,也就是说,如果担心内存消耗,它将在绑定到变量后立即对其进行评估。 生成器 :

  • 我必须编写一些代码,将Java8流的内容多次添加到列表中,我很难找到最好的方法。根据我在SO上读到的内容(主要是这个问题:如何将Java8流的元素添加到现有列表中)和其他地方,我将其缩小到以下选项: PS:在我的示例代码中,我使用作为需要在流上执行的任何操作的占位符

  • 本文向大家介绍Python 修改列表中的元素方法,包括了Python 修改列表中的元素方法的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇Python 修改列表中的元素方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。