【问题标题】:Rearrange list in-place by modifying the original list, put even-index values at front通过修改原始列表重新排列列表,将偶数索引值放在前面
【发布时间】:2018-10-17 20:26:00
【问题描述】:

我对 python 比较陌生,但我仍在努力学习该语言的基础知识。我偶然发现了一个问题,它要求您通过修改原始列表来重新排列列表。您应该做的是将所有偶数索引值移到前面(以相反的顺序),然​​后是奇数索引值。

例子:

l = [0, 1, 2, 3, 4, 5, 6]
l = [6, 4, 2, 0, 1, 3, 5]

我最初的方法是只使用以下内容:

l = l[::-2] + l[1::2]

但是,显然这被认为是“创建一个新列表”,而不是遍历原始列表来修改它。

因此,我希望获得一些关于我应该如何处理这个特定问题的想法或提示。我知道我可以使用 for 循环或 while 循环来循环遍历元素/索引,但我不知道如何进行交换或其他任何事情。

【问题讨论】:

  • 我不知道如何进行交换”:学习如何做到这一点是一个很好的起点。请咨询您的 Python 书籍或导师。
  • 在 Python 中交换很容易:x, y = y, z。它也适用于列表索引:l[x], l[y] = l[y], l[x]
  • 顺便说一句 l = [0, 1, 2, 3, 4, 5, 6, 7] 是一个糟糕的例子,因为这些值与索引相同。
  • 编辑:如果您进行排序/就地排序,则无法避免复制,因为您需要一个自定义排序函数来比较索引(而不是值)的奇数/均匀性。因此,排序函数需要接受由 enumerate(l) 生成的 (index, value) 元组。但那是副本。

标签: python list slice indices in-place


【解决方案1】:

您可以通过分配给列表切片而不是变量来做到这一点:

l[:] = l[::2][::-1] + l[1::2]

你对反转偶数元素的表达也是错误的。使用l[::2] 获取所有偶数,然后使用[::-1] 反转。

这实际上等同于:

templ = l[::2][::-1] + l[1::2]
for i in range(len(l)):
    l[i] = templ[i]

for 循环在原地修改原始列表。

【讨论】:

  • 仍然创建了一个新列表,不是吗?
  • 谢谢,但我觉得此时这会破坏问题本身的目的。
  • @DyZ 作为中间变量是的,但引用 l 不会改变。它只是变异的。
  • @Julien 我完全理解你的观点,但作为一名教师,我不会接受这个作为解决方案。
  • @DyZ 谢谢。你可能是对的,教练真的希望通过交换列表中的元素来完成所有事情(即它使用 O(1) 空间而不是 O(n) 空间)。如果是这样,问题需要更具体。随时发布更好的答案。
猜你喜欢
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 2021-12-24
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 2016-06-18
相关资源
最近更新 更多