如何通过索引一次将多个值插入到列表中

时间:2016-05-23 05:16:09

标签: python python-3.x

我想知道是否有办法使用相同的索引一次将多个变量插入到列表中。例如,假设我们有一个

列表

[a, b, c]

[0,1,2,3,4]

我希望插入第一个列表,以便最终结果为

[a, 0, 1, b, 2, 3, c, 4]

但如果我打算单独使用list.insert(pos, value)并使用[0, 2, 4]的位置,则后续使用的位置将变为无效,因为它与5个元素的旧列表相关而不是6个元素

有什么建议吗?

4 个答案:

答案 0 :(得分:3)

一个简单的选择是添加以具有最高值的位置开头的项目,然后继续使用第二个最高值等。

通过这种方式,您可以使用原始方法,而不会出现任何"旧/新位置问题"

答案 1 :(得分:2)

list_a = [0,1,2,3,4]
list_b = ["a", "b", "c"]
pos    = [0, 2, 4]

assert(len(list_b) == len(pos))
acc = 0
for i in range(len(list_b)):
    list_a.insert(pos[i]+acc, list_b[i])
    acc += 1

print(list_a)
  

[' a',0,1,' b',2,3,' c',4]

答案 2 :(得分:2)

不使用列表理解的一种方法:

>>> a = [0,1,2,3,4]
>>> b = ['a', 'b', 'c']
>>> ind = [0, 2, 4]
>>> d = dict(zip(ind, b))

>>> [t for k in [(d.get(i),j) for i,j in enumerate(a)] for t in k if t is not None]
['a', 0, 1, 'b', 2, 3, 'c', 4]

答案 3 :(得分:0)

另一种选择,不使用索引累加器,但仍然要求索引按升序排列。

newObjects = ["a", "b", "c"]
newObjectIndices = [0, 2, 4]
existingList = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

for index, obj in zip(reversed(newObjectIndices), reversed(newObjects)):
    existingList.insert(index, obj)

print(existingList)       # ['a', 0, 1, 'b', 2, 3, 'c', 4, 5, 6, 7, 8, 9]

如果无法保证升序,那么排序是一种可能的解决方案。

newObjects = ["b", "a", "c"]
newObjectIndices = [2, 0, 4]
existingList = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

for index, obj in reversed(sorted( zip(newObjectIndices, newObjects), key=lambda tup: tup[0])):
    existingList.insert(index, obj)

print(existingList)     # ['a', 0, 1, 'b', 2, 3, 'c', 4, 5, 6, 7, 8, 9]