Seperti orang lain disebutkan pop dan del adalah yang cara efisien untuk menghapus item dari indeks yang diberikan. Namun hanya demi penyelesaian (karena hal yang sama dapat dilakukan melalui banyak cara dengan Python):
Menggunakan irisan (ini tidak dilakukan untuk menghapus item dari daftar asli):
(Juga ini akan menjadi metode yang paling tidak efisien ketika bekerja dengan daftar Python, tetapi ini bisa berguna (tapi tidak efisien, saya tegaskan kembali) ketika bekerja dengan objek yang ditentukan pengguna yang tidak mendukung pop, belum mendefinisikan a __getitem__
):
>>> a = [1, 2, 3, 4, 5, 6]
>>> index = 3 # Only positive index
>>> a = a[:index] + a[index+1 :]
# a is now [1, 2, 3, 5, 6]
Catatan: Harap dicatat bahwa metode ini tidak mengubah daftar di tempat seperti pop
dan del
. Alih-alih itu membuat dua salinan daftar (satu dari awal sampai indeks tetapi tanpa itu ( a[:index]
) dan satu setelah indeks sampai elemen terakhir ( a[index+1:]
)) dan membuat objek daftar baru dengan menambahkan keduanya. Ini kemudian dipindahkan ke variabel daftar ( a
). Objek daftar lama karenanya direferensi dan karenanya sampah dikumpulkan (asalkan objek daftar asli tidak dirujuk oleh variabel apa pun selain a).
Ini membuat metode ini sangat tidak efisien dan juga dapat menghasilkan efek samping yang tidak diinginkan (terutama ketika variabel lain menunjuk ke objek daftar asli yang tetap tidak dimodifikasi).
Terima kasih kepada @MarkDickinson karena menunjukkan ini ...
Ini jawaban Stack Overflow menjelaskan konsep mengiris.
Perhatikan juga bahwa ini hanya berfungsi dengan indeks positif.
Saat menggunakan dengan objek, __getitem__
metode harus didefinisikan dan yang lebih penting __add__
metode harus didefinisikan untuk mengembalikan objek yang berisi item dari kedua operan.
Intinya, ini bekerja dengan objek apa pun yang definisi kelasnya seperti:
class foo(object):
def __init__(self, items):
self.items = items
def __getitem__(self, index):
return foo(self.items[index])
def __add__(self, right):
return foo( self.items + right.items )
Ini bekerja dengan list
yang mendefinisikan __getitem__
dan __add__
metode.
Perbandingan tiga cara dalam hal efisiensi:
Anggaplah yang berikut ini sudah ditentukan sebelumnya:
a = range(10)
index = 3
Itu del object[index]
Metode:
Sejauh ini metode yang paling efisien. Berhasil semua objek yang mendefinisikan a__del__
metode.
Pembongkarannya adalah sebagai berikut:
Kode:
def del_method():
global a
global index
del a[index]
Membongkar:
10 0 LOAD_GLOBAL 0 (a)
3 LOAD_GLOBAL 1 (index)
6 DELETE_SUBSCR # This is the line that deletes the item
7 LOAD_CONST 0 (None)
10 RETURN_VALUE
None
pop
metode:
Itu kurang efisien daripada metode del dan digunakan ketika Anda perlu mendapatkan item yang dihapus.
Kode:
def pop_method():
global a
global index
a.pop(index)
Membongkar:
17 0 LOAD_GLOBAL 0 (a)
3 LOAD_ATTR 1 (pop)
6 LOAD_GLOBAL 2 (index)
9 CALL_FUNCTION 1
12 POP_TOP
13 LOAD_CONST 0 (None)
16 RETURN_VALUE
Iris dan tambahkan metode.
Paling tidak efisien.
Kode:
def slice_method():
global a
global index
a = a[:index] + a[index+1:]
Membongkar:
24 0 LOAD_GLOBAL 0 (a)
3 LOAD_GLOBAL 1 (index)
6 SLICE+2
7 LOAD_GLOBAL 0 (a)
10 LOAD_GLOBAL 1 (index)
13 LOAD_CONST 1 (1)
16 BINARY_ADD
17 SLICE+1
18 BINARY_ADD
19 STORE_GLOBAL 0 (a)
22 LOAD_CONST 0 (None)
25 RETURN_VALUE
None
Catatan: Dalam ketiga disassemble mengabaikan dua baris terakhir yang pada dasarnya adalah return None
. Juga dua baris pertama memuat nilai global a
dan index
.
O(n)
dalam operasi waktu.deque()
menyediakan operasi yang efisien di kedua ujungnya tetapi tidak memberikan O (1) penyisipan / pencarian / penghapusan di tengah.