Liste filtreleme: vs lambda filtre anlama liste
Bir listem var ve bu öğeleri bir öznitelik tarafından filtre var. temel filtreleme ihtiyacı olan kendimi bulmam oldu:
Benim kod bu gibi görünüyor.
my_list = [i for i in my_list if i.attribute == value]
Ama sonra düşündüm, daha iyi olmaz mıydı böyle yazmak için?
filter(lambda x: x.attribute == value, my_list)
Daha okunaklı ve performans için gerekirse lambda kazanmak için bir şey almış olabilir.
Soru: ikinci yolu kullanarak herhangi bir uyarı var mı? Herhangi bir performans farkı? Eksik Pythonic Yol tamamen™ ve başka bir şekilde (lambda yerine itemgetter gibi) yapmalı mıyım?
CEVAP
Kişiden kişiye değişir ne kadar garip. Bu liste üreteci çirkin filtre lambda den çok daha net buluyorum, ama daha kolay bulmak hangisi kullanın. Ancak, değişken isimleri zaten sadece çirkin ve tartışmaya açık bir konu değil bu yerleşiklere için kullanılan vermeyi bırak.
Filtre kullanımını yavaşlatabilir iki şey vardır.
Python fonksiyon (def olup olmadığını ya da lambda tarafından oluşturulan) olarak filtre listesi kavrama daha yavaş olması olasıdır olmaz. ilk işlev çağrısı yükü: Neredeyse kesinlikle bu konuda yeterli değildir, ve kod zaman aşımına ve bir tıkanıklık olduğu kadar fazla performans düşünmemelisin, ama fark orada olacak.
Geçerli olabilecek diğer havai lambda kapsamlı bir değişken (value
) erişmek zorunda ediliyor. Bu yerel bir değişken erişim daha yavaş ve Python 2.x liste anlama sadece yerel değişkenleri erişir. Python 3 kullanıyorsanız.x liste anlama da bir kapatma ile value
erişim olacak şekilde ayrı bir işlevi çalıştırır ve bu fark geçerli değildir.
Göz önünde başka seçenek listesi kavrama yerine bir jeneratör kullanmaktır
def filterbyvalue(seq, value):
for el in seq:
if el.attribute==value: yield el
Ana kod okunabilirliği çok önemli yeri olan) liste üreteci ve umarım anlamlı bir işlev adı ile filtre yerine geldin o zaman.
Bir liste Lambda/kullanarak sıralama E...
Özel (nesne) ile Liste Görünümü filtre...
/Başka liste anlama?eğer Python: ...
Bu hata ne anlama geliyor: "hata:...
liste bir anlama olmazsa...