Najbardziej wydajne podejście
Możesz również wstawić element za pomocą indeksowania plasterków na liście. Na przykład:
>>> a = [1, 2, 4]
>>> insert_at = 2
>>> b = a[:]
>>> b[insert_at:insert_at] = [3]
>>> b
[1, 2, 3, 4]
Aby wstawić wiele elementów razem w danym indeksie , wystarczy użyć jednego list
z wielu elementów, które chcesz wstawić. Na przykład:
>>> a = [1, 2, 4]
>>> insert_at = 2
>>> insert_elements = [3, 5, 6]
>>> a[insert_at:insert_at] = insert_elements
>>> a
[1, 2, 3, 5, 6, 4]
Alternatywne użycie rozumienia list (ale bardzo powolne pod względem wydajności) :
Alternatywnie można to osiągnąć za pomocą rozumienia list z enumerate
zbyt. (Ale proszę, nie rób tego w ten sposób. To tylko dla ilustracji) :
>>> 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]
Porównanie wydajności wszystkich rozwiązań
Oto timeit
porównanie wszystkich odpowiedzi z listą 1000 elementów dla Pythona 3.4.5:
Moja odpowiedź przy użyciu wstawiania w plasterkach - najszybsza (3,08 µs na pętlę)
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
Zaakceptowana odpowiedź ATOzTOA oparta na scalaniu list podzielonych na plasterki - druga (6,71 µsek na pętlę)
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
Odpowiedź Rushy'ego Panchala z większością głosówlist.insert(...)
- trzecia (26,5 usek na pętlę)
python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b.insert(500, 3)"
10000 loops, best of 3: 26.5 µsec per loop
Moja odpowiedź ze zrozumieniem listy ienumerate
- czwarty (bardzo wolny z 168 µs na pętlę)
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
b = a[:].insert(2,3)
wydaje się dość krótki, nie ma wpływu na oryginalną listę i jest dość opisowy.