Sisipkan elemen pada indeks tertentu dalam daftar dan kembalikan daftar yang diperbarui


99

Aku punya ini:

>>> 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]

Apakah ada cara agar saya bisa mendapatkan daftar yang diperbarui sebagai hasilnya, daripada memperbarui daftar asli?


11
b = a[:].insert(2,3)tampaknya cukup pendek, tidak memengaruhi daftar asli dan cukup deskriptif.
mkoistinen

6
@mkoistinen Itu tidak berhasil untuk saya. >>> a = [1, 2, 3, 4] >>> b = a[:].insert(2, 5) >>> print b None
SparkAndShine

Jawaban:


90

l.insert(index, obj)sebenarnya tidak mengembalikan apa pun. Itu hanya memperbarui daftar.

Seperti yang dikatakan ATO, Anda bisa melakukannya b = a[:index] + [obj] + a[index:]. Namun, cara lain adalah:

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

56
Jika Anda tidak dapat mentolerir 3 baris kode yang dapat dibaca, masukkan ke dalam fungsi dan panggil.
IceArdor

56

Pendekatan paling efisien kinerja

Anda juga dapat memasukkan elemen menggunakan indeks irisan dalam daftar. Sebagai contoh:

>>> 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]

Untuk menyisipkan beberapa elemen bersama pada indeks tertentu , yang perlu Anda lakukan adalah menggunakan salah satu listdari beberapa elemen yang ingin Anda sisipkan. Sebagai contoh:

>>> 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]

Alternatif menggunakan pemahaman daftar (tetapi sangat lambat dalam hal kinerja) :

Sebagai alternatif, dapat dicapai dengan menggunakan daftar pemahaman dengan enumeratejuga. (Tapi tolong jangan lakukan seperti ini. Ini hanya untuk ilustrasi) :

>>> 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]

Perbandingan kinerja semua solusi

Berikut timeitperbandingan semua jawaban dengan daftar 1000 elemen untuk Python 3.4.5:

  • Jawaban saya menggunakan irisan sisipan - Tercepat (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
  • Jawaban yang diterima ATOzTOA berdasarkan penggabungan daftar yang diiris - Detik (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
  • Jawaban Rushy Panchal dengan suara terbanyak menggunakanlist.insert(...)- Ketiga (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
  • Jawaban saya dengan Pemahaman Daftar danenumerate- Keempat (sangat lambat dengan 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
Saya sangat menyukai hasil ini karena mudah diperluas untuk menyelesaikan masalah, bagaimana jika saya ingin memasukkan nilai 3, 3.5ke dalam daftar itu (secara berurutan) -> a[2:2] = [3,3.5]. Sangat rapi
minillinim

1
Bagaimana cara kerja [2: 2] = a_list? a [2: 2] pada dasarnya dimulai dari indeks ke-2 hingga indeks ke-1 (2-1) tetapi dalam arah maju yang berarti daftar [] kosong. Bagaimana itu meluas? Jika kita melakukan [2: 3: -1] itu tidak berhasil.
SamCodes

Jawaban yang bagus. Saya ingin tahu apakah kompleksitas pilihan terbaik adalah O (1)? Jika ya, mengapa?
Lerner Zhang

Jawaban ini perlu diperbarui. Untuk kali ini saya tidak dapat mereproduksi pengaturan waktu yang dilaporkan bahkan dengan Python 3.4 (saya mendapatkan faktor 2 antara list.insertdan tugas potong), dan pada Python 3.8 perbedaan ini telah hilang sepenuhnya. Cara paling jelas untuk memasukkan elemen adalah dengan menggunakan list.insert, tentu saja.
Tamu

39

Yang terpendek yang saya dapatkan: 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]

Jumlah baris kode bukanlah ukuran kualitas kode yang baik. Pendekatan ini cacat karena alasan kinerja dan keterbacaan.
Tamu

0

Pendekatan terbersih adalah menyalin daftar dan kemudian memasukkan objek ke dalam salinan. Di Python 3, ini dapat dilakukan melalui list.copy:

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

Pada Python 2 menyalin daftar dapat dilakukan melalui new = old[:](ini juga bekerja pada Python 3).

Dalam hal kinerja, tidak ada perbedaan dengan metode lain yang diusulkan:

$ 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

-2

Gunakan metode insert () daftar Python . Pemakaian:

#Sintaksis

Sintaks untuk metode insert () -

list.insert(index, obj)

#Parameters

  • index - Ini adalah Indeks tempat object object perlu dimasukkan.
  • obj - Ini adalah Objek yang akan dimasukkan ke dalam daftar yang diberikan.

#Return Value Metode ini tidak mengembalikan nilai apa pun, tetapi menyisipkan elemen yang diberikan pada indeks yang diberikan.

Contoh:

a = [1,2,4,5]

a.insert(2,3)

print(a)

Kembali [1, 2, 3, 4, 5]


2
Ini tidak menjawab pertanyaan itu.
Gustav Bertram

5
Pertanyaannya spesifik: Is there anyway I can get the updated list as result, instead of updating the original list in place?Jawaban Anda sebaliknya.
Laszlowaty
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.