我有这个:
>>> 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]
无论如何,我可以获得更新后的列表,而不是更新原始列表吗?
答案 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]