Zdarzyło mi się, że mam podstawową potrzebę filtrowania: mam listę i muszę ją filtrować według atrybutu elementów.
Mój kod wyglądał tak:
my_list = [x for x in my_list if x.attribute == value]
Ale potem pomyślałem, czy nie byłoby lepiej tak napisać?
my_list = filter(lambda x: x.attribute == value, my_list)
Jest bardziej czytelny, a w razie potrzeby można wyjąć lambda, aby coś zyskać.
Pytanie brzmi: czy są jakieś zastrzeżenia dotyczące korzystania z drugiego sposobu? Jakaś różnica w wydajności? Czy całkowicie brakuje mi Pythonic Way ™ i czy powinienem to zrobić w jeszcze inny sposób (np. Używając itemgetter zamiast lambda)?
filter
jest obiekt generatora filtrów, a nie lista.
filter
było to bardziej czytelne. Kiedy masz proste wyrażenie, które mogą być używane jak jest w listcomp, ale musi być zapakowane w lambda (lub podobnie zbudowane zpartial
luboperator
funkcji, etc.), aby przekazaćfilter
, że właśnie wtedy listcomps wygrać.