Listelerdeki del, remove ve pop'lar arasındaki fark


Yanıtlar:


1329

Evet, belirli bir dizini değil remove, ilk eşleşen değeri kaldırır :

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

del belirli bir dizindeki öğeyi kaldırır:

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

ve popbelirli bir indeksi ve getiri o öğeyi kaldırır.

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

Hata modları da farklıdır:

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

14
@jxramos: delbir sözdizimi bağlantısı değil, hayır. Sözdizimi değişmez, tıpkı returnveya ifveya gibi while.
Martijn Pieters

6
Kullanıcıların bir liste üzerinde yineleme yaparken ve bu işlevleri yinelemeyle aynı anda kullanırken dikkatli olmaları gerektiğini belirtmek gerekir.
hamaney

16
delÖrnek yanıltıcı olabilir. Hangi öğe tam olarak kaldırıldı? 2'nci veya 3'üncü? Sen kullanılmış olmalıdır [9, 8, 7, 6], del a[1]ve[9, 7, 6]
gromit190

2
@ rite2hhh eşitliği test eder. Optimizasyon olarak önce kimlik için eşitlik testleri testi
Martijn Pieters

1
@ rite2hhh: değer eşitliği ifade referansında yer alır .
Martijn Pieters

183

Kullanım del, dizine göre bir öğe kaldırmak için pop()döndürülen değeri gerekiyorsa dizine göre çıkarmak için ve remove()değerine göre bir öğe silmek için. İkincisi listenin aranmasını gerektirir ve listede ValueErrorböyle bir değer olmazsa yükselir .

Bir öğe ilistesinden dizin silinirken n, bu yöntemlerin hesaplama karmaşıklıkları

del     O(n - i)
pop     O(n - i)
remove  O(n)

1
Pop listede arama yapılmasını gerektiriyor
sachin irukula

31
Karmaşıklık dökümü için +1. Öğe listenin sonunda olduğunda silme ve pop'un sabit olduğunu gösterir.
Büyük Sharpie

2
Beyler hatırlayın ... indeks tabanlı her şey tek atış O (n-1) ... eğer bir arama yapmak zorunda kalırsanız (değere göre), öğe bulunana kadar koleksiyondan geçecektir.
Pepito Fernandez

2
@PepitoFernandez Listedeki indekse göre aramalar Python'da O (1) şeklindedir. (Python'daki bir liste C ++ 'daki bir vektöre benzer.)
Sven Marnach

3
@PlasmaBinturong Performansın önemli olduğunu kanıtlayan verileriniz yoksa, daha okunabilir olduğunu düşündüğünüz şeyi kullanmalısınız. Ve eğer varsa, özel durumunuzda daha hızlı olanı ölçmeniz gerekir. Tahminimce bu delbiraz daha hızlı, ancak farklı bir nedenden dolayı: __delitem__C'de uygulanan bir tür için arama , adından ziyade indekse göre yapılırken pop, tüm tanımlayıcı protokolünü izleyerek bakılması gerekir. Fonksiyonların kendilerinin yerine getirilmesi aynı süreyi almalıdır. Her ikisi de bir işaretçiyi döndürür - biri kaldırılan nesneye, diğeri None.
Sven Marnach

91

Başka hiç kimse bundan bahsetmediğinden , liste dilimleme nedeniyle del(farklı olarak pop) bir dizi dizinin kaldırılmasına izin verdiğini unutmayın :

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

Bu ayrıca IndexError, dizin listede yoksa bir öğeden kaçınılmasını sağlar :

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

55

Zaten başkaları tarafından oldukça iyi cevaplandı. Bu benim sonumdan :)

kaldır vs pop vs del

Açıkçası, popdeğeri döndüren removetek şeydir ve nesneyi arayan tek kişi, delbasit bir silme ile sınırlanır.


2
Thnx! Bir not:
Python'da

19

En iyi açıklamalar burada ama daha basitleştirmek için elimden geleni yapacağım.

Tüm bu yöntemler arasında, delete öneki varken reverse & pop postfix'tir .

remove (): Öğenin ilk oluşumunu kaldırmak için kullanılır

remove(i) => i değerinin ilk oluşumu

>>> 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 (): Aşağıdaki durumlarda öğeyi kaldırmak için kullanılır:

belirtilmemiş

pop() => listenin sonundan

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

belirtildi

pop(index) => dizin

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

UYARI: Önümüzdeki Tehlikeli Yöntem

delete () : Bu bir önek yöntemidir.

Aynı yöntem için iki farklı sözdizimine dikkat edin: [] ve (). Aşağıdakiler için güce sahiptir:

1. dizini sil

del a[index] => dizin ve onunla ilişkili değeri tıpkı pop gibi silmek için kullanılır.

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

2. aralıktaki değerleri silin [index 1: index N]

del a[0:3] => aralıktaki birden çok değer

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

3.List ama liste değil, tüm listeyi tek bir çekimde silmek için

del (a) => yukarıda belirtildiği gibi.

>>>del (a)
>>>a

Umarım bu varsa karışıklığı netleştirir.


18

pop - Dizin alır ve Değer döndürür

remove - Değer alır, ilk olayı kaldırır ve hiçbir şey döndürmez

delete - Dizin alır, bu dizindeki değeri kaldırır ve hiçbir şey döndürmez


2

Farklı veri yapıları üzerindeki herhangi bir işlem / işlev belirli eylemler için tanımlanır. Burada sizin durumunuzda bir öğeyi kaldırmak, silmek, Pop ve kaldırmak. (Kümeleri düşünürseniz, Başka bir işlem ekleyin - atın) Ekleme sırasında kafa karıştırıcı başka bir durum var. Ekle / Ekleme. Gösteri için, deque uygulayalım. deque, her iki uçtan eleman ekleyebileceğiniz / eleman kaldırabileceğiniz karma bir doğrusal veri yapısıdır (Arka ve ön Uçlar)

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

Burada, operasyonlara bakın:

def deleteFront(self):

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

Operasyonlar bir şey geri vermek zorunda. Yani, pop - Bir dizin ile ve bir dizin olmadan. Değeri döndürmek istemiyorsam: del self.items [0]

Dizin yerine değere göre sil:

  • Kaldırmak :

    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

İade [1,3,5,7]

setlerin durumunu ele alalım.

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.

1

Pop ve delete her ikisi de yukarıdaki açıklamalarda belirtildiği gibi bir öğeyi kaldırmak için dizinler alır. Önemli bir fark onlar için zaman karmaşıklığıdır. İndekssiz pop () için zaman karmaşıklığı O (1) 'dir, ancak son elemanın silinmesi için aynı durum değildir.

Kullanım durumunuz her zaman son öğeyi silmekse, delete () yerine pop () kullanılması her zaman tercih edilir. Zaman karmaşıklıkları hakkında daha fazla açıklama için https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt adresine bakabilirsiniz.


2
Bu çeşitli şekillerde yanlıştır. Diye bir yöntem yoktur delete. Farklılıklar pop, değeri döndüren ve deldilimler üzerinde çalışanlardır . Durumlarda popçalışır deltam olarak aynı hesaplama karmaşıklığı vardır (ve sabit terimi ile biraz daha hızlıdır).
abarnert

1

Remove listede operasyon kaldırmak için bir değer verilir. Bu değere sahip bir öğe bulmak için listede arama yapar ve bulduğu ilk eşleşen öğeyi siler. Eşleşen bir öğe yoksa, bir ValueError değerini yükseltirse bir hatadır .

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

Del deyimi bütün bir listeyi silmek için kullanılabilir. Del argümanınız olarak belirli bir liste öğeniz varsa (örn. Listedeki 8. öğeye özellikle başvurmak için liste adı [7]), yalnızca bu öğeyi siler. Bir "dilim" i listeden silmek bile mümkündür. Dizin aralık dışındaysa , bir IndexError oluşturursa bir hatadır .

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

Pop'un genel kullanımı , listeyi yığın olarak kullandığınızda listeden son öğeyi silmektir. Del'in aksine pop, listeden attığı değeri döndürür. İsteğe bağlı olarak, listenin sonundan başka pop ve pop'a bir dizin değeri verebilirsiniz (örn. Listname.pop (0), ilk öğeyi listeden siler ve ilk öğeyi sonuç olarak döndürür). Listenin kuyruk gibi davranmasını sağlamak için bunu kullanabilirsiniz, ancak kuyruk işlemlerine pop (0) 'dan daha iyi performans sağlayabilen kitaplık yordamları vardır. Dizin aralık dışındaysa , bir IndexError oluşturursa bir hatadır .

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

Daha fazla bilgi için collections.deque adresine bakın.


-1

Kaldır temelde değer üzerinde çalışır. Dizindeki çalışmayı silme ve pop

Kaldır, temel olarak ilk eşleşen değeri kaldırır. Sil, öğeyi belirli bir dizinden siler Pop temelde bir dizin alır ve bu dizindeki değeri döndürür. Listeyi bir sonraki yazdırdığınızda değer görünmez.

Misal:


3
Cevabınız için teşekkür etmemize rağmen, diğer cevapların üzerine ek değer katması daha iyi olur. Bu durumda, yanıtınız ek değer sağlamaz, çünkü diğer kullanıcılar yanıtınıza eklediğiniz her şeyi kapsamaktadır. İkincil bir sorun olarak, metni metin olarak yapıştırabildiğinizde lütfen resim olarak metin eklemeyin. Önceki bir yanıt size yardımcı olduysa , oy vermeniz gerekir .
David Buck

-3

Bir değeri dizine göre kaldırmak için remove komutunu da kullanabilirsiniz.

n = [1, 3, 5]

n.remove(n[1])

n sonra [1, 5]


43
Deneyin n = [5, 3, 5]o zaman n.remove(n[2]).
abarnert

@abarnert kullanım durumunuz aşağıdaki n = [5,3,5], ardından n.remove (5) ile eşzamanlı olarak çalışır. Bunların her ikisi de ilk karşılaşılan öğeyi listeden kaldırır.
Akhil Ghatiki

@AkhilGhatiki n.remove(n[2])kaldırır n[0], değil n[2]. Bu nedenle, sadece sebepsiz doğrusal zaman değil (belki N = 3 olduğunda büyük bir anlaşma değil), aynı zamanda yanlıştır (N ne olursa olsun büyük bir anlaşma)
abarnert
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.