1) Neredeyse İngilizce tarzı:
in
Operatörü kullanarak varlığını test edin , ardından remove
yöntemi uygulayın .
if thing in some_list: some_list.remove(thing)
remove
Yöntem sadece ilk geçtiği kaldıracaktır thing
kullanabileceğiniz tüm oluşumları çıkarmak için, while
yerine if
.
while thing in some_list: some_list.remove(thing)
- Yeterince basit, muhtemelen seçimim. Küçük listeler için (tek satırlara dayanamaz)
Bu sürgün-ilk-soru-son-tavrı Python'da yaygındır. Nesnenin uygun olup olmadığını önceden test etmek yerine, sadece işlemi gerçekleştirin ve ilgili İstisnaları yakalayın:
try:
some_list.remove(thing)
except ValueError:
pass # or scream: thing not in some_list!
except AttributeError:
call_security("some_list not quacking like a list!")
Tabii ki, yukarıdaki örnekte yer alan maddeler hariç, sadece şüpheli bir mizah değil, tamamen gereksizdir (amaç, konsepte aşina olmayan insanlar için ördek tipini göstermekti).
Bir şeyin birden fazla tekrarlanmasını bekliyorsanız:
while True:
try:
some_list.remove(thing)
except ValueError:
break
- bu özel kullanım durumu için biraz ayrıntılı, ancak Python'da çok deyimsel.
- bu # 1'den daha iyi performans gösterir
- PEP 463 , burada kullanışlı olacak basit kullanım dışında, deneme / kullanım için daha kısa bir sözdizimi önerdi, ancak onaylanmadı.
Ancak, contextlib'in suppress () contextmanager (python 3.4'te tanıtıldı) ile yukarıdaki kod basitleştirilebilir:
with suppress(ValueError, AttributeError):
some_list.remove(thing)
Yine, birden fazla şey olmasını bekliyorsanız:
with suppress(ValueError):
while True:
some_list.remove(thing)
3) fonksiyonel tarzı:
Yaklaşık 1993, Python var lambda
, reduce()
, filter()
ve map()
, bir nezaket Lisp onları cevapsız korsan ve gönderilen çalışma yamalar *. filter
Öğeleri listeden kaldırmak için kullanabilirsiniz :
is_not_thing = lambda x: x is not thing
cleaned_list = filter(is_not_thing, some_list)
Durumunuz için yararlı olabilecek bir kısayol var: boş öğeleri filtrelemek istiyorsanız (aslında , sıfır, boş dizeler veya diğer boş koleksiyonlar bool(item) == False
gibi öğeler None
), ilk argüman olarak Yok'u iletebilirsiniz:
cleaned_list = filter(None, some_list)
- [güncelleme] : Python 2.x içinde, eskisine
filter(function, iterable)
eşdeğerdi [item for item in iterable if function(item)]
(ya [item for item in iterable if item]
da ilk argüman ise None
); Python 3.x sürümünde, artık buna eşdeğerdir (item for item in iterable if function(item))
. En küçük fark, bir listeyi döndürmek için kullanılan filtredir, şimdi bir jeneratör ifadesi gibi çalışır - bu sadece temizlenmiş listeyi yineliyor ve atarsanız sorun değil, ancak gerçekten bir listeye ihtiyacınız varsa, filter()
aramayı kapsamalısınız ile list()
yapıcısı.
- * Bu Lispy aromalı yapılar Python'da biraz yabancı olarak kabul edilir. 2005 civarında, Guido düşme hakkında bile konuşuyordu
filter
- yoldaşlarla birlikte map
ve reduce
(henüz gitmediler , ancak yüksek dereceli fonksiyonları seviyorsanız bir göz atmaya değer functools modülüne reduce
taşındılar ).
4) Matematiksel stil:
Liste kavrayışları , PEP 202 tarafından 2.0 sürümünde tanıtıldığından beri Python'da liste manipülasyonu için tercih edilen stil oldu . Bunun ardındaki mantık Liste comprehensions nerede durumlarda listeleri oluşturmak için daha kısa bir yol sağlamak olduğunu map()
ve filter()
ve / veya iç içe döngüler anda kullanılacaktır.
cleaned_list = [ x for x in some_list if x is not thing ]
Jeneratör ifadeleri PEP 289 tarafından 2.4 sürümünde tanıtılmıştır . Bir jeneratör ifadesi, bellekte tam bir listenin oluşturulmasına gerçekten ihtiyaç duymadığınız (veya istemediğiniz) durumlar için daha iyidir - tıpkı öğeler üzerinde birer birer yineleme yapmak istediğinizde olduğu gibi. Yalnızca liste üzerinde yineleme yapıyorsanız, bir jeneratör ifadesini tembel olarak değerlendirilen bir liste kavraması olarak düşünebilirsiniz :
for item in (x for x in some_list if x is not thing):
do_your_thing_with(item)
notlar
!=
yerine eşitsizlik operatörünü kullanmak isteyebilirsiniz is not
( fark önemlidir )
- liste kopyasını ima eden yöntem eleştirmenleri için: popüler inanışın aksine, üreteç ifadeleri liste anlamalarından her zaman daha etkili değildir - lütfen şikayet etmeden önce profil oluşturun