问题:在列表中的特定索引处插入元素,然后返回更新后的列表
我有这个:
>>> 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]
有没有一种方法可以获取更新的列表作为结果,而不是就地更新原始列表?
I have this:
>>> 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]
Is there a way I can get the updated list as the result, instead of updating the original list in place?
回答 0
l.insert(index, obj)
实际上不返回任何东西。它只是更新列表。
正如ATO所说,您可以做到b = a[:index] + [obj] + a[index:]
。但是,另一种方法是:
a = [1, 2, 4]
b = a[:]
b.insert(2, 3)
l.insert(index, obj)
doesn’t actually return anything. It just updates the list.
As ATO said, you can do b = a[:index] + [obj] + a[index:]
.
However, another way is:
a = [1, 2, 4]
b = a[:]
b.insert(2, 3)
回答 1
最高效的方法
您也可以使用列表中的切片索引插入元素。例如:
>>> 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 the 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]
使用列表理解的替代方法 (但性能很慢):
作为替代方案,它可以使用来实现清单理解与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个元素列表的比较:
使用切片插入的地雷解答 -最快(每个循环3.08微秒)
mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b[500:500] = [3]"
100000 loops, best of 3: 3.08 µsec per loop
ATOzTOA接受的基于切片列表合并的答案 -秒(每个循环6.71微秒)
mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:500] + [3] + a[500:]"
100000 loops, best of 3: 6.71 µsec per loop
鲁希·潘查尔(Rushy Panchal)的票数最多,答案是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 µsec per loop
我的回答与列表理解和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 µsec per loop
Most performance efficient approach
You may also insert the element using the slice indexing in the list. For example:
>>> 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 the original list
>>> b[insert_at:insert_at] = [3] # Insert "3" within "b"
>>> b
[1, 2, 3, 4]
For inserting multiple elements together at a given index, all you need to do is to use a list
of multiple elements that you want to insert. For example:
>>> 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]
Alternative using list comprehension (but very slow in terms of performance):
As an alternative, it can be achieved using list comprehension with enumerate
too. (But please don’t do it this way. It is just for illustration):
>>> 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]
Performance comparison of all solutions
Here’s the timeit
comparison of all the answers with list of 1000 elements for Python 3.4.5:
Mine answer using sliced insertion – Fastest (3.08 µsec per loop)
mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b[500:500] = [3]"
100000 loops, best of 3: 3.08 µsec per loop
ATOzTOA’s accepted answer based on merge of sliced lists – Second (6.71 µsec per loop)
mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:500] + [3] + a[500:]"
100000 loops, best of 3: 6.71 µsec per loop
Rushy Panchal’s answer with most votes using list.insert(...)
– Third (26.5 usec per loop)
python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b.insert(500, 3)"
10000 loops, best of 3: 26.5 µsec per loop
My answer with List Comprehension and enumerate
– Fourth (very slow with 168 µsec per loop)
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 µsec per loop
回答 2
我得到的最短信息: 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]
The shortest I got: 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]
回答 3
最干净的方法是复制列表,然后将对象插入副本。在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
The cleanest approach is to copy the list and then insert the object into the copy. On Python 3 this can be done via list.copy
:
new = old.copy()
new.insert(index, value)
On Python 2 copying the list can be achieved via new = old[:]
(this also works on Python 3).
In terms of performance there is no difference to other proposed methods:
$ 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
使用Python列表insert()方法。用法:
#句法
insert()方法的语法-
list.insert(index, obj)
#参数
- index-这是需要在其中插入对象obj的索引。
- obj-这是要插入给定列表的对象。
#Return Value此方法不返回任何值,但会将给定元素插入给定索引。
例:
a = [1,2,4,5]
a.insert(2,3)
print(a)
退货 [1, 2, 3, 4, 5]
Use the Python list insert() method. Usage:
#Syntax
The syntax for the insert() method −
list.insert(index, obj)
#Parameters
- index − This is the Index where the object obj need to be inserted.
- obj − This is the Object to be inserted into the given list.
#Return Value
This method does not return any value, but it inserts the given element at the given index.
Example:
a = [1,2,4,5]
a.insert(2,3)
print(a)
Returns [1, 2, 3, 4, 5]