改变列表中索引的位置



交换未确定长度列表的索引的最佳方法是什么?我想要成对交换数字的位置,这样第一个和第二个数字就交换了,第三个和第四个数字也交换了,等等。我所知道的唯一方法是:

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

但我不知道如何做到这一点,如果列表是不确定的长度。示例列表将包括[1,2,3,4],并返回[2,1,4,3]。但如果它是奇数,则列表的最后一个索引保持在相同的位置。

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

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"

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

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取第二个迭代器(与第一个迭代器相同)时,它已经前进了一个位置。因为有两个迭代器,所以它将两个元素分组为元组,但元素是唯一迭代器中按顺序排列的元素。