>>> 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]
>>>
Listeden bir öğeyi kaldırmak için yukarıdaki üç yöntem arasında herhangi bir fark var mı?
>>> 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]
>>>
Listeden bir öğeyi kaldırmak için yukarıdaki üç yöntem arasında herhangi bir fark var mı?
Yanıtlar:
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 pop
belirli 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
del
bir sözdizimi bağlantısı değil, hayır. Sözdizimi değişmez, tıpkı return
veya if
veya gibi while
.
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]
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 ValueError
böyle bir değer olmazsa yükselir .
Bir öğe i
listesinden dizin silinirken n
, bu yöntemlerin hesaplama karmaşıklıkları
del O(n - i)
pop O(n - i)
remove O(n)
del
biraz 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
.
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]
Zaten başkaları tarafından oldukça iyi cevaplandı. Bu benim sonumdan :)
Açıkçası, pop
değeri döndüren remove
tek şeydir ve nesneyi arayan tek kişi, del
basit bir silme ile sınırlanır.
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]
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.
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
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
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.
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.
delete
. Farklılıklar pop
, değeri döndüren ve del
dilimler üzerinde çalışanlardır . Durumlarda pop
çalışır del
tam olarak aynı hesaplama karmaşıklığı vardır (ve sabit terimi ile biraz daha hızlıdır).
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.
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.
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]
n = [5, 3, 5]
o zaman n.remove(n[2])
.
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)