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?

ATOzTOA
sumber
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)
Rushy Panchal
sumber
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
Moinuddin Quadri
sumber
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]
ATOzTOA
sumber
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
seorang tamu
sumber
-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]

Arjun Sanchala
sumber
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