Perbedaan antara del, hapus dan pop pada daftar

928
>>> a=[1,2,3]
>>> a.remove(2)
>>> a
[1, 3]
>>> a=[1,2,3]
>>> del a[1]
>>> a
[1, 3]
>>> a= [1,2,3]
>>> a.pop(1)
2
>>> a
[1, 3]
>>> 

Apakah ada perbedaan antara ketiga metode di atas untuk menghapus elemen dari daftar?

sachin irukula
sumber
1
Posting terkait pada baris yang sama untuk mengatur struktur data - Perbedaan waktu antara metode set.discard dan set.remove dengan Python?
RBT

Jawaban:

1333

Ya, removemenghilangkan pertama pencocokan nilai , bukan indeks tertentu:

>>> a = [0, 2, 3, 2]
>>> a.remove(2)
>>> a
[0, 3, 2]

del menghapus item pada indeks tertentu:

>>> a = [9, 8, 7, 6]
>>> del a[1]
>>> a
[9, 7, 6]

dan popmenghapus item pada indeks tertentu dan mengembalikannya.

>>> a = [4, 3, 5]
>>> a.pop(1)
3
>>> a
[4, 5]

Mode kesalahan mereka juga berbeda:

>>> a = [4, 5, 6]
>>> a.remove(7)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
>>> del a[7]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> a.pop(7)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: pop index out of range
Martijn Pieters
sumber
14
@ jxramos: delbukan penahan sintaks, tidak. Sintaksnya tidak berubah, seperti returnatau ifatau while.
Martijn Pieters
6
Perlu disebutkan bahwa pengguna harus berhati-hati ketika melakukan iterasi pada daftar dan menggunakan fungsi-fungsi ini di atasnya pada saat yang sama seperti iterasi.
hamaney
16
The delcontoh agak menyesatkan. Elemen mana yang dihapus, tepatnya? Yang ke-2 atau ke-3? Anda seharusnya menggunakan [9, 8, 7, 6], del a[1]dan[9, 7, 6]
gromit190
2
@ rite2hhh itu menguji kesetaraan. Tes kesetaraan menguji identitas terlebih dahulu sebagai pengoptimalan
Martijn Pieters
1
@ rite2hhh: persamaan nilai dicakup dalam referensi ekspresi .
Martijn Pieters
184

Gunakan deluntuk menghapus elemen dengan indeks, pop()untuk menghapusnya dengan indeks jika Anda membutuhkan nilai yang dikembalikan, dan remove()untuk menghapus elemen dengan nilai. Yang terakhir membutuhkan pencarian daftar, dan naik ValueErrorjika tidak ada nilai seperti itu terjadi dalam daftar.

Saat menghapus indeks idari daftar nelemen, kompleksitas komputasi dari metode ini adalah

del     O(n - i)
pop     O(n - i)
remove  O(n)
Sven Marnach
sumber
1
Apakah pop memerlukan pencarian daftar
sachin irukula
31
+1 untuk pemecahan kompleksitas. Mengilustrasikan bagaimana menghapus dan pop konstan ketika elemen berada di akhir daftar.
Big Sharpie
2
Ingat teman-teman ... indeks berdasarkan apa pun adalah satu tembakan O (n-1) ... jika Anda harus melakukan pencarian (berdasarkan nilai), itu akan melintasi koleksi sampai elemen ditemukan.
Pepito Fernandez
2
@PepitoFernandez Mencari berdasarkan indeks dalam daftar adalah O (1) dengan Python. (Daftar dengan Python mirip dengan vektor dalam C ++.)
Sven Marnach
3
@PlasmaBinturong Anda harus menggunakan apa yang menurut Anda lebih mudah dibaca, kecuali jika Anda memiliki data yang membuktikan bahwa kinerja itu penting. Dan jika sudah, Anda perlu mengukur apa yang lebih cepat dalam kasus spesifik Anda. Dugaan saya juga delsedikit lebih cepat, tetapi untuk alasan yang berbeda: pencarian untuk __delitem__tipe yang diimplementasikan dalam C terjadi dengan indeks daripada dengan nama, sedangkan popperlu dilihat setelah mengikuti seluruh protokol deskriptor. Eksekusi fungsi itu sendiri harus mengambil jumlah waktu yang sama. Keduanya mengembalikan pointer - satu ke objek yang dihapus, yang lainnya ke None.
Sven Marnach
92

Karena tidak ada orang lain yang menyebutkannya, perhatikan bahwa del(tidak seperti pop) memungkinkan penghapusan rentang indeks karena pengirisan daftar:

>>> lst = [3, 2, 2, 1]
>>> del lst[1:]
>>> lst
[3]

Ini juga memungkinkan penghindaran IndexErrorjika indeks tidak ada dalam daftar:

>>> lst = [3, 2, 2, 1]
>>> del lst[10:]
>>> lst
[3, 2, 2, 1]
Chris_Rands
sumber
55

Sudah dijawab cukup baik oleh orang lain. Yang ini dari akhir saya :)

hapus vs pop vs del

Jelas, popadalah satu-satunya yang mengembalikan nilai, dan removesatu-satunya yang mencari objek, sementara delmembatasi dirinya pada penghapusan sederhana.

Saurav Sahu
sumber
2
Thnx! Satu catatan: dalam python, karena cara daftar diimplementasikan (ada array praktis ...!), "Maju sampai posisi simpul" adalah O (1)
ntg
19

pop - Mengambil Indeks dan mengembalikan Nilai

remove - Mengambil nilai, menghapus kejadian pertama, dan tidak mengembalikan apa pun

delete - Mengambil indeks, menghapus nilai pada indeks itu, dan tidak mengembalikan apa pun

Bahubali Patil
sumber
19

Banyak penjelasan terbaik ada di sini tetapi saya akan mencoba yang terbaik untuk menyederhanakan lebih banyak.

Di antara semua metode ini, reverse & pop adalah postfix sementara delete adalah prefix .

remove (): Digunakan untuk menghapus elemen yang pertama kali muncul

remove(i) => kemunculan pertama dari nilai i

>>> a = [0, 2, 3, 2, 1, 4, 6, 5, 7]
>>> a.remove(2)   # where i = 2
>>> a
[0, 3, 2, 1, 4, 6, 5, 7]

pop (): Digunakan untuk menghapus elemen jika:

tidak ditentukan

pop() => dari akhir daftar

>>>a.pop()
>>>a
[0, 3, 2, 1, 4, 6, 5]

ditentukan

pop(index) => dari indeks

>>>a.pop(2)
>>>a
[0, 3, 1, 4, 6, 5]

PERINGATAN: Metode Berbahaya Di Depan

delete () : Ini metode awalan.

Perhatikan dua sintaks yang berbeda untuk metode yang sama: [] dan (). Ia memiliki kekuatan untuk:

1. Hapus indeks

del a[index] => digunakan untuk menghapus indeks dan nilai terkait seperti pop.

>>>del a[1]
>>>a
[0, 1, 4, 6, 5]

2.Hapus nilai dalam kisaran [indeks 1: indeks N]

del a[0:3] => beberapa nilai dalam rentang

>>>del a[0:3]
>>>a
[6, 5]

3.Terakhir tetapi tidak daftar, untuk menghapus seluruh daftar dalam satu kesempatan

del (a) => seperti yang dikatakan di atas.

>>>del (a)
>>>a

Semoga ini menjelaskan kebingungan jika ada.

Mayur Patil
sumber
2

Setiap operasi / fungsi pada struktur data yang berbeda didefinisikan untuk tindakan tertentu. Di sini, dalam kasus Anda yaitu menghapus elemen, menghapus, Pop dan menghapus. (Jika Anda mempertimbangkan set, Tambahkan operasi lain - buang) Kasing membingungkan lainnya adalah saat menambahkan. Sisipkan / Tambah. Untuk Demonstrasi, Mari kita Implementasikan deque. deque adalah struktur data linier hybrid, di mana Anda dapat menambahkan elemen / menghapus elemen dari kedua ujungnya. (Belakang dan depan Berakhir)

class Deque(object):

  def __init__(self):

    self.items=[]

  def addFront(self,item):

    return self.items.insert(0,item)
  def addRear(self,item):

    return self.items.append(item)
  def deleteFront(self):

    return self.items.pop(0)
  def deleteRear(self):
    return self.items.pop()
  def returnAll(self):

    return self.items[:]

Di sini, lihat operasinya:

def deleteFront(self):

    return self.items.pop(0)
def deleteRear(self):
    return self.items.pop()

Operasi harus mengembalikan sesuatu. Jadi, pop - Dengan dan tanpa indeks. Jika saya tidak ingin mengembalikan nilainya: del self.items [0]

Hapus dengan nilai bukan Indeks:

  • hapus:

    list_ez=[1,2,3,4,5,6,7,8]
    for i in list_ez:
        if i%2==0:
            list_ez.remove(i)
    print list_ez

Pengembalian [1,3,5,7]

mari kita perhatikan kasus set.

set_ez=set_ez=set(range(10))

set_ez.remove(11)

# Gives Key Value Error. 
##KeyError: 11

set_ez.discard(11)

# Does Not return any errors.
phanindravarma
sumber
1

Sementara pop dan hapus keduanya ambil indeks untuk menghapus elemen seperti yang dinyatakan dalam komentar di atas. Perbedaan utama adalah kompleksitas waktu untuk mereka. Kompleksitas waktu untuk pop () tanpa indeks adalah O (1) tetapi bukan kasus yang sama untuk penghapusan elemen terakhir.

Jika use case Anda selalu untuk menghapus elemen terakhir, selalu lebih baik menggunakan pop () daripada delete (). Untuk penjelasan lebih lanjut tentang kompleksitas waktu, Anda dapat merujuk ke https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt

skashyap
sumber
2
Ini salah dalam banyak hal. Tidak ada metode seperti itu delete. Perbedaannya adalah yang popmengembalikan nilai, dan yang delbekerja pada irisan. Dalam kasus di mana popkarya, delmemiliki kompleksitas komputasi yang persis sama (dan sedikit lebih cepat dengan istilah yang konstan).
abarnert
1

The menghapus operasi pada daftar diberi nilai untuk menghapus. Itu mencari daftar untuk menemukan item dengan nilai itu dan menghapus item yang cocok pertama kali ditemukan. Ini adalah kesalahan jika tidak ada item yang cocok, menimbulkan ValueError .

>>> x = [1, 0, 0, 0, 3, 4, 5]
>>> x.remove(4)
>>> x
[1, 0, 0, 0, 3, 5]
>>> del x[7]
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    del x[7]
IndexError: list assignment index out of range

The del Pernyataan dapat digunakan untuk menghapus seluruh daftar. Jika Anda memiliki item daftar tertentu sebagai argumen untuk dihapus (mis. Listname [7] untuk merujuk item ke-8 dalam daftar), itu hanya akan menghapus item itu. Bahkan dimungkinkan untuk menghapus "slice" dari daftar. Ini adalah kesalahan jika ada indeks di luar jangkauan, menimbulkan IndexError .

>>> x = [1, 2, 3, 4]
>>> del x[3]
>>> x
[1, 2, 3]
>>> del x[4]
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    del x[4]
IndexError: list assignment index out of range

Penggunaan pop yang biasa adalah untuk menghapus item terakhir dari daftar saat Anda menggunakan daftar sebagai tumpukan. Tidak seperti del, pop mengembalikan nilai yang muncul dari daftar. Anda secara opsional dapat memberikan nilai indeks ke pop dan pop dari selain akhir daftar (mis. Listname.pop (0) akan menghapus item pertama dari daftar dan mengembalikan item pertama sebagai hasilnya). Anda dapat menggunakan ini untuk membuat daftar berperilaku seperti antrian, tetapi ada rutinitas perpustakaan yang tersedia yang dapat memberikan operasi antrian dengan kinerja yang lebih baik daripada pop (0). Ini adalah kesalahan jika ada indeks di luar jangkauan, menimbulkan IndexError .

>>> x = [1, 2, 3] 
>>> x.pop(2) 
3 
>>> x 
[1, 2]
>>> x.pop(4)
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    x.pop(4)
IndexError: pop index out of range

Lihat collections.deque untuk lebih jelasnya.

Kushan Gunasekera
sumber
-1

Hapus pada dasarnya bekerja pada nilai. Hapus dan pop pekerjaan pada indeks

Hapus pada dasarnya menghapus nilai pencocokan pertama. Hapus menghapus item dari indeks tertentu. Pop pada dasarnya mengambil indeks dan mengembalikan nilai pada indeks itu. Lain kali Anda mencetak daftar, nilainya tidak muncul.

Contoh:

Harshal SG
sumber
3
Meskipun kami berterima kasih atas jawaban Anda, akan lebih baik jika memberikan nilai tambahan di atas jawaban lainnya. Dalam hal ini, jawaban Anda tidak memberikan nilai tambahan, karena pengguna lain membahas semua yang telah Anda sertakan dalam jawaban Anda. Sebagai masalah kedua, harap jangan sertakan teks sebagai gambar saat Anda dapat menempelkannya sebagai teks. Jika jawaban sebelumnya bermanfaat bagi Anda, Anda harus memilihnya .
David Buck
-3

Anda juga dapat menggunakan hapus untuk menghapus nilai berdasarkan indeks juga.

n = [1, 3, 5]

n.remove(n[1])

n kemudian merujuk ke [1, 5]

maks runia
sumber
43
Coba kalau n = [5, 3, 5]begitu n.remove(n[2]).
abarnert
@abarnert use case Anda bekerja selaras dengan case di bawah ini n = [5,3,5], lalu n.remove (5). Keduanya menghapus elemen yang ditemui pertama dari daftar.
Akhil Ghatiki
@AkhilGhatiki n.remove(n[2])Menghapus n[0], tidak n[2]. Jadi bukan hanya waktu linier tanpa alasan (mungkin bukan masalah besar ketika N = 3), itu juga salah (masalah besar apa pun N)
abarnert