AW: [Python-de] Funktionale Denksportaufgabe

Rainer Fischbach fischbach at ecs-gmbh.de
Thu Sep 26 21:00:16 EDT 2002


At 19:08 26.09.2002 +0200, you wrote:
>Losung ohne List Comprehension
>
>filter1 = lambda f,s:not f and s or (lambda y=[]:(map(lambda x:f(x) and
>(y.append(x),),s),y))()[1]
>
># test
>f = lambda x: not (x % 3)
>
>s = range(10)
>print filter1(None,s)
>print filter1(f,s)
>print s
>
>
Ob man list comprehensions oder map/reduce als Primitive nimmt, ist
Geschmacksache (wenn man ganz elementar sein möchte, kann man auch alles
nur mit lambda machen). Wesentlich klarer und eleganter ist das folgende:

rfil = lambda p, seq: (p == None and seq or
                       reduce (lambda s, x: p (x) and s + [x] or s, seq, []))

den Listenverpackungs-0-Indizierungstrick kann man sich hier sparen, da in
dem Fall, wenn seq zu false evaluiert, die Faltungsfunktion ohnehin nicht
zur Anwendung kommt und innerhalb der Faltungsfunktion [x] immer zu true
evaluiert. 

Übrigens kann man auch map durch reduce ausdrücken:

rmap = lambda f, seq: reduce (lambda s, x: s + [f (x)], seq, [])

sl, Rainer

     
    Rainer Fischbach
______________________________________________________

    ECS
    Engineering Consulting & Solutions GmbH
    Muehlstrasse 3
    D-92318  Neumarkt

    Phone:               +49 (0)9181 - 4764-84
    Fax:                 +49 (0)9181 - 4764-50
    Mobile:              +49 (0)171  - 41 41 570
    e-mail:              fischbach at ecs-gmbh.de
    WWW:                 http://www.ecs-gmbh.de
______________________________________________________






More information about the Python-de mailing list