在列表中的特定索引处插入元素并返回更新列表

时间:2013-02-15 13:16:03

标签: python python-2.7 list insert

我有这个:

>>> a = [1, 2, 4]
>>> print a
[1, 2, 4]

>>> print a.insert(2, 3)
None

>>> print a
[1, 2, 3, 4]

>>> b = a.insert(3, 6)
>>> print b
None

>>> print a
[1, 2, 3, 6, 4]

无论如何,我可以获得更新后的列表,而不是更新原始列表吗?

6 个答案:

答案 0 :(得分:62)

l.insert(index, obj)实际上并没有返回任何内容,它只是更新列表。 正如ATO所说,你可以做b = a[:index] + [obj] + a[index:]。 但是,另一种方式是:

a = [1, 2, 4]
b = a[:]
b.insert(2, 3)

答案 1 :(得分:30)

我得到的最短:b = a[:2] + [3] + a[2:]

>>> 
>>> a = [1, 2, 4]
>>> print a
[1, 2, 4]
>>> b = a[:2] + [3] + a[2:]
>>> print a
[1, 2, 4]
>>> print b
[1, 2, 3, 4]

答案 2 :(得分:26)

最具效果的方法

您也可以使用列表中的切片索引插入元素。例如:

>>> a = [1, 2, 4]
>>> insert_at = 2  # index at which you want to insert item

>>> b = a[:]   # created copy of list "a" as "b"
               # skip this step if you are ok with modifying original list

>>> b[insert_at:insert_at] = [3]  # insert "3" within "b"
>>> b
[1, 2, 3, 4]

对于在给定索引处插入多个元素,您需要做的就是使用要插入的多个元素的list。例如:

>>> a = [1, 2, 4]
>>> insert_at = 2   # index starting from which multiple elements will be inserted 

# List of elements that you want to insert together at "index_at" (above) position
>>> insert_elements = [3, 5, 6]

>>> a[insert_at:insert_at] = insert_elements
>>> a   # [3, 5, 6] are inserted together in `a` starting at index "2"
[1, 2, 3, 5, 6, 4]

使用列表理解的替代方法 (但在性能方面非常慢)

作为替代方案,也可以使用 list comprehension enumerate来实现。 (但请不要这样做。这只是为了说明)

>>> a = [1, 2, 4]
>>> insert_at = 2

>>> b = [y for i, x in enumerate(a) for y in ((3, x) if i == insert_at else (x, ))]
>>> b
[1, 2, 3, 4]

所有解决方案的性能比较

这里的所有答案的timeit比较与Python 3.4.5的1000个元素列表:

  • Mine answer使用切片插入 - 最快(每个循环使用3.08次)

    mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b[500:500] = [3]"
    100000 loops, best of 3: 3.08 usec per loop
    
  • ATOzTOA's accepted answer基于切片列表的合并 - 第二个(每个循环6.71次使用)

    mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:500] + [3] + a[500:]"
    100000 loops, best of 3: 6.71 usec per loop
    
  • Rushy Panchal's answer使用list.insert(...)投票最多 - 第三次(每次循环使用26.5次)

    python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b.insert(500, 3)"
    10000 loops, best of 3: 26.5 usec per loop
    
  • Mine answer列表理解enumerate - 第四个(非常慢,每个循环使用168次)

    mquadri$ python3 -m timeit -s "a = list(range(1000))" "[y for i, x in enumerate(a) for y in ((3, x) if i == 500 else (x, )) ]"
    10000 loops, best of 3: 168 usec per loop
    

答案 3 :(得分:0)

最干净的方法是复制列表,然后将对象插入副本。在Python 3上,这可以通过list.copy完成:

new = old.copy()
new.insert(index, value)

在Python 2上,可以通过new = old[:]来复制列表(这在Python 3上也适用)。

就性能而言,与其他提议的方法没有区别:

$ python --version
Python 3.8.1
$ python -m timeit -s "a = list(range(1000))" "b = a.copy(); b.insert(500, 3)"
100000 loops, best of 5: 2.84 µsec per loop
$ python -m timeit -s "a = list(range(1000))" "b = a.copy(); b[500:500] = (3,)"
100000 loops, best of 5: 2.76 µsec per loop

答案 4 :(得分:0)

a=[1, 3, 5, 7, 9]

a.insert(4,6)

打印(a)

答案 5 :(得分:-3)

使用Python list insert() Method。用法:

  

语法

     

以下是insert()方法的语法 -

     

list.insert(index, obj)

     

参数

     
      
  • index - 这是需要插入对象obj的索引。
  •   
  • obj - 这是要插入给定列表的对象。
  •   
     

返回值

     

此方法不返回任何值,但会将给定元素插入给定索引。

示例:

a = [1,2,4,5]

a.insert(2,3)

print(a)

返回[1, 2, 3, 4, 5]