【问题标题】:Changing position of indexes in a list更改列表中索引的位置
【发布时间】:2021-12-10 13:42:21
【问题描述】:

交换未确定长度列表索引的最佳方法是什么?我想成对交换数字的位置,以便交换第一个和第二个数字,交换第三个和第四个数字,等等。我知道如何做到这一点的唯一方法是:

   my_list[0], my_list[1] = my_list[1], my_list[0]

但如果列表长度未定,我不知道该怎么做。示例列表将包括 [1,2,3,4] 并返回 [2,1,4,3]。但如果很奇怪,列表的最后一个索引会保持在相同的位置。

【问题讨论】:

  • 正确!这是最好的python成语。
  • 您能更具体地说明您要做什么吗?如果列表的长度不确定,您如何知道要交换哪些元素?
  • 如果列表“长度未定”,您是要反转它,还是交换第一个和最后一个元素?或者完全是别的什么?
  • 很抱歉。我想成对交换数字的位置,以便交换第一个和第二个数字,交换第三个和第四个数字,等等。
  • @charbs_33 - 编辑问题以包含该信息。比隐藏在 cmets 中更明确。

标签: python list


【解决方案1】:

首先将列表分组为两个元素的元组

it = iter(my_list)
grouped = zip(it, it)

现在grouped 是一个迭代器。它产生两个元素的元组。

然后加入所有反转它们的元组:

new_list = [y for x in grouped for y in reversed(x)]

这只会添加对。如果列表是奇数,则最后一个元素不会添加到 new_list。所以我们把最后一个元素放在它的位置:

new_list[len(mylist)-1] = my_list[-1]

如果它已经存在,则没有任何变化。

第一部分(分组)比较晦涩,但不难理解。 zip 依次从每个迭代器的参数中获取元素,并将它们分组为元组。但是在这种情况下,我将相同的迭代器放置了两次,因此当 zip 采用第二个迭代器(与第一个迭代器相同)时,它已经提前了一个位置。所以它分组为两个元素的元组,因为有 2 个迭代器,但元素是按顺序来自唯一迭代器的元素。

【讨论】:

  • 它很聪明.. 但是当 lst 有奇数时它不起作用:例如lst = [1, 2, 3, 4, 5]
  • 谢谢。你说的对。 Y 已经修改了
【解决方案2】:

您可以使用range(start, stop, step) 来进行索引。然后应用您现有的模式

my_list = [1, 2, 3, 4]

for i in range(0, len(my_list)-1, 2):
    my_list[i], my_list[i+1] = my_list[i+1], my_list[i]

assert my_list == [2, 1, 4, 3], "swapped okay"

【讨论】:

  • 这似乎只适用于我尝试的第一个索引
  • 没关系,我明白了。感谢您的帮助1
  • @charbs_33 - 很高兴它成功了。
  • 我假设如果列表很奇怪,我可以为它做一个简单的 if/else 语句
  • @charbs_33 - 不,这就是我添加 len(my_list)-1 的原因。如果它是一个奇数长度的列表,交换将在最终值之前停止。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
相关资源
最近更新 更多