2015-06-11 10 views
7

Jestem ciekawa, czy można coś zrobić za pomocą funkcji map(), którą mogę wykonać poprzez zrozumienie list.funkcja mapy Pythona (+ lambda) z warunkowaniem (jeśli)

Dla ex, wziąć tę listę komp:

example_list = [x*2 for x in range(5) if x*2/6. != 1] 

oczywiście, to daje mi [0, 2, 4, 8].

Jak wykonać ekwiwalent za pomocą funkcji map()? Wykonanie tego spowoduje błąd składni.

example_map = map(lambda x:x*2 if x*2/6. != 1, range(5)) 

Po prostu staram się lepiej zrozumieć, jak korzystać z tej funkcji.

Odpowiedz

6

Będziesz musiał zawinąć map wokół filter wokół listy:

example_map = map(lambda x: x*2, filter(lambda x: x*2/6. != 1, range(5))) 
+0

proszę chwycić moją odpowiedź i włączyć go ponownie i mogę usunąć. Trochę za długo na komentarz –

3

Alternatywnie, można filter swój map zamiast map ing swoją filter.

example_map = filter(lambda x: x/6. != 1, map(lambda x: x*2, range(5))) 

Wystarczy pamiętać, że jesteś teraz filtrowanie wynik niż oryginalna (tj lambda x: x/6. != 1 zamiast lambda x: x*2/6. != 1 od x już podwoiła się od mapy)

Heck, jeśli naprawdę chcesz, możesz rodzaju z rzucie to wszystko razem z wyrażeniem warunkowym

example_map = map(lambda x: x*2 if x*2/6. != 1 else None, range(5)) 

Ale to zostawiają cię z [0, 2, 4, None, 8]. filter(None, example_map) spowoduje upuszczenie None s i pozostawi Cię zgodnie z oczekiwaniami jako [0, 2, 4, 8].

+0

Szukałem tego! –

3

Wzdłuż inne odpowiedzi, które sugeruje pewne rozwiązania przyczyną swój błąd składni że map funkcja:

Zastosuj funkcję do każdego elementu iterable i zwraca listę wyników.

Więc wynik jest w takiej samej długości jak twój iterable.and jeśli używasz if oświadczenie trzeba określić else też.

>>> map(lambda x:x*2 if x*2/6. != 1 else None, range(5)) 
[0, 2, 4, None, 8] 

I jako alternatywny sposób można wykorzystać itertools.ifilter filtrować iterable:

>>> from itertools import ifilter 
>>> map(lambda x:x*2,ifilter(lambda x: x*2/6. != 1,range(5))) 
[0, 2, 4, 8] 

Zauważ, że nie musisz wynik przefiltrowanej listy i chcesz po prostu przekazać go do map bardziej wydajne jest użycie ifilter, ponieważ zwraca generator i można zaoszczędzić dużo pamięci dla długich list;) (wszystko w python 2 i python 3 filter zwraca generator)

+0

"bardziej wydajne jest użycie' ifilter', ponieważ zwraca generator "przy założeniu, że i tak używasz Python2. W języku Python3 "filter" to 'ifilter', a' ifilter' nie istnieje! :) Potem znowu w Python3, 'coś/6.' nie ma większego sensu. –

+0

@AdamSmith Tak, nie widziałem, że OP mówi o python3, w każdym razie dobry punkt, zauważę to;) – Kasramvd

Powiązane problemy