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.