Seite 1 von 2

Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 21:36
von d_rose
Hallo Leute, hätte man ne frage und zwar, ist es möglich mehrere if Anweisung innerhalb einer lambda Funktion zu verwenden ?
Bei Elif streikt die Funktion nämlich.

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 21:39
von noisefloor
Hallo,

probier's doch aus :-)

Was hast du denn konkret vor? Was hast du schon probiert? Was funktioniert nicht so, wie du es dir vorstellst?

Gruß, noisefloor

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 21:48
von __deets__
d_rose hat geschrieben: Dienstag 27. November 2018, 21:36 Hallo Leute, hätte man ne frage und zwar, ist es möglich mehrere if Anweisung innerhalb einer lambda Funktion zu verwenden ?
Bei Elif streikt die Funktion nämlich.
lambdas können nur Ausdrücke. Nicht Anweisungen. if / elif ist aber eine Anweisung. Also nein. Du kannst allerdings ternäre Operatoren benutzen:

Code: Alles auswählen

x if a else y if b else z  

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 21:50
von d_rose
also es geht darum das die Funktion 2 Zeichenketten nach ihrer Länge vergleichen soll und die kleinere Zeichenkette ausgeben soll und bei gleich länger sollen die Wörter lexikografisch verglichen werde aber mir fehlt der Ansatz lambda so zu schreiben das falls die Wörter gleich lang sind er diese mit < vergleichen soll und das "kleinere" ausgeben soll

Hier mein code :

Code: Alles auswählen

kleiner1 = lambda w1,w2 : w1 if len(w1) < len(w2) else (w1 if w1 < w2 else ( w1 if len(w1) == len(w2)  else w2))
ist sehr chaotisch aber zu 90% macht es was es soll.

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 21:52
von noisefloor
Hallo,

warum muss das denn unbedingt in eine Lambda-Funktion? Lesbar ist das nicht wirklich...

Gruß, noisefloor

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 21:58
von d_rose
Würde es auch Gerne anders und für mich übersichtlicher lösen aber die aufgabe die ich bearbeite fordert eine lambda Funktion.

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 22:03
von __deets__
Für das Problem brauchst du ja auch kein geschachteltes if/elif, sondern nur stinknormale Veroderung. Mit “or”

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 22:28
von d_rose
macht er bei or nicht das eine oder das andere ? also er soll die Zeichenkette nur lexikografisch vergleichen falls sie gleichlang sind

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 22:28
von d_rose
macht er bei or nicht das eine oder das andere ? also er soll die Zeichenkette nur lexikografisch vergleichen falls sie gleichlang sind

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 22:35
von __deets__
Wenn a kürzer b ist, soll der Ausdruck wahr sein. Wenn es das nicht ist, soll der Ausdruck das Ergebnis des lexikographischen Vergleichs sein. Das ist veroderung.

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 22:40
von d_rose
okay aber dann hab ich ja als "Return" true oder false und kein string wenn ich das jetzt richtig verstehe.
Ich nutze nämlich das was die lambda Funktion mir zurückgibt in einer anderen Funktion, wo die lambda Funktion Als Parameter fungiert.

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 22:52
von __deets__
ein Vergleich endet notwendigerweise mit einem boolschen wert. Wenn du den irgendwie wieder verarbeitet haben willst, mach das halt.

Deine eigentliche Frage ist beantwortet. lambda kann das nicht anders. Wenn du das benuzten musst, musst du dich halt mit dem ternären Operator begnügen. Was genau nun dein Problem ist kann man aus dem was du bisher dargelegt hast nicht erschliesssen.

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 23:02
von d_rose

Code: Alles auswählen

list1 = ["z","aaa","1","11111","ccv","22"]



def sortiere(kleiner,L):
           trenner = 0
           while trenner != len(L):
                   for i in range(trenner,len(L)):
                           if kleiner(L[i],L[trenner]):
                                   L[trenner], L[i] = L[i], L[trenner]
                   trenner += 1
           return L


kleiner1 = lambda w1,w2 : w1 if len(w1) < len(w2) or w1 < w2 or w2 < w1 else w2  

print(sortiere(kleiner1,list1))

hier der rest vom code, das lambda hat jetzt noch kein sinn.

korrekt müsstet meines Erachtens die liste ["1","z","22","aaa","ccv","11111"] herausgegeben wenn mein lambda das macht was es machen soll.
aber bisher spiegelt er mir nur die liste einfach

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 23:16
von __deets__
Bei dem Code brauchst du immer noch kein String als Rückgabe. Das or reicht.

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 23:20
von __deets__
Und warum die äußere Schleife kein for ist, erschließt sich mir auch nicht.

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 23:22
von d_rose
die Funktion sortiere ist so wie wir sie verwenden sollen aus der Handreichung entnommen.
mich wundert allerdings schon wenn ich lambda nur so schreibe

Code: Alles auswählen

kleiner1 = lambda w1,w2 : w1 if len(w1) < len(w2) else w2 
das die liste die mir def sortiere gibt nur gespiegelt ist und nicht nach länge der einzelnen Elemente sortiert ist.

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 23:36
von __deets__
Weil du immer einen String zurück gibst der nicht leer ist. Und den dann für einen Vergleich benutzt. Ein nicht-leerer String ist aber immer wahr. Also könntest du genauso gut lambda x, y : True schreiben.

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 23:43
von d_rose
ok das war mir jetzt etwas hilfreich.

Code: Alles auswählen

kleiner1 = lambda w1,w2 : len(w1) < len(w2) or w1 < w2 
so bin ich der Sache nun 50 % näher dran

noch irgendein tipp ? ohne mir alles vorzusagen :D

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 23:44
von __deets__
So hätte ich das deiner Beschreibung nach auch beschrieben. Wenn das nicht tut, ist das Problem woanders oder du hast nicht ausreichend spezifiziert.

Re: Lambda/If-Anweisungen

Verfasst: Dienstag 27. November 2018, 23:48
von d_rose
ich würde jetzt ungern den code des profs in frage stellen :D

also ich soll einen lambda-ausdruck schreiben zur längenlexikografischen Ordnung zweier Zeichenketten und bei dem fall das die Zeichenketten gleichlang sind soll die Ordnung lexikografisch erfolgen. Mehr kann ich im Moment auch nicht sagen.

Meines Erachtens nach nun nach deiner Hilfestellung ist der lambda Ausdruck korrekt aber trotzdem sieht die liste anschließend so aus :

["1","22","ccv","11111","aaa","z"]