如何以相同顺序将一个列表的元素插入另一个列表?

How can I insert elements of one list into another list in the same order?

假设我有一个水果列表,我想将该列表的元素插入到另一个列表中。使用 List comprehension 我会得到一个如下所示的代码:

fruit = ["apple", "orange", "banana", "peach"]

my_list = []

[my_list.insert(0, i) for i in fruit]

print(my_list)

这个returns:

['peach', 'banana', 'orange', 'apple']

但是,我希望元素按与原始列表相同的顺序排列。 我的想法就是这样颠倒过来:

[my_list.insert(-1, i) for i in fruit]

但是 returns 出于某种原因:

['orange', 'banana', 'peach', 'apple']

有人可以解释一下为什么使用索引 [-1] 会导致这种奇怪的顺序吗?我怎样才能达到原来的顺序?

编辑:

我忘了补充一点,我正在寻找一种在列表开头插入列表元素的方法,所以添加

的元素
more_fruit = ["pear", "pineapple", "coconut"]

my_list = ["apple", "orange", "banana", "peach"]

应该导致

my_list = ["pear", "pineapple", "coconut", "apple", "orange", "banana", "peach"]

插入索引是元素在插入后的索引。您真正尝试的是:

[my_list.insert(len(my_list), i) for i in fruit]

my_list 变成预期的副本。 使用 -1 作为插入索引插入 before 最后一个元素,这对第一个元素不起作用,因为没有最后一个元素之前,因此顺序很奇怪。

话虽如此,如果您不使用结果列表,您真的不应该使用 comperehensions 来产生副作用。请注意 [my_list.insert(-1, i) for i in fruit] 实际上 returns [None, None, None, None].

有更好的方法来实现这样的浅拷贝:

my_list.extend(fruit)
my_list = fruit[:]
my_list = [f for f in fruit]

仅举几例。

  1. 如果要将新项目添加到列表末尾,可以使用 append 而不是 insert
  2. 您使用 -1 获得 "mixed" 版本排序的原因是插入到 -1 位置将元素放入列表中的 "next to the last" 元素中.

因此,如果您有列表 ["a", "b"] 并将 "c" 插入 -1 的位置 - 您的新列表将是 ["a", "c", "b"].

至于您的代码 - 您可以使用:

[my_list.append(x) for x in fruit]

甚至更好:

my_list = fruit[::]

这会将 fruit 的项目复制到 my_list

使用list.index()它returns元素的索引,如果你知道元素在原始列表中的索引那么你可以完全按照原始列表插入。

fruit = ["apple", "orange", "banana", "peach"]

my_list = []

[my_list.insert(fruit.index(i),i) for i in fruit]

print(my_list)

输出是:

原始列表Fruit : ['apple', 'orange', 'banana', 'peach']

和my_list:

['apple', 'orange', 'banana', 'peach']

通常不建议在列表理解中使用 "side effects",也不建议使用它们代替 for 循环。您可以使用简单的下标将一个列表插入另一个列表:

more_fruit = ["pear", "pineapple", "coconut"]
my_list    = ["apple", "orange", "banana", "peach"]

my_list[0:0] = more_fruit

输出:

print(my_list)

# ['pear', 'pineapple', 'coconut', 'apple', 'orange', 'banana', 'peach']

注意:下标是对列表中某些元素的引用,可以是单个元素,也可以是元素范围。在这种情况下,我们要替换从位置 0 开始的包含零元素的一系列元素。