Lambda/If-Anweisungen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
d_rose
User
Beiträge: 57
Registriert: Dienstag 30. Oktober 2018, 11:34

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.
Benutzeravatar
noisefloor
User
Beiträge: 4187
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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  
d_rose
User
Beiträge: 57
Registriert: Dienstag 30. Oktober 2018, 11:34

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.
Benutzeravatar
noisefloor
User
Beiträge: 4187
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

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

Gruß, noisefloor
d_rose
User
Beiträge: 57
Registriert: Dienstag 30. Oktober 2018, 11:34

Würde es auch Gerne anders und für mich übersichtlicher lösen aber die aufgabe die ich bearbeite fordert eine lambda Funktion.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Für das Problem brauchst du ja auch kein geschachteltes if/elif, sondern nur stinknormale Veroderung. Mit “or”
d_rose
User
Beiträge: 57
Registriert: Dienstag 30. Oktober 2018, 11:34

macht er bei or nicht das eine oder das andere ? also er soll die Zeichenkette nur lexikografisch vergleichen falls sie gleichlang sind
Zuletzt geändert von d_rose am Dienstag 27. November 2018, 22:29, insgesamt 1-mal geändert.
d_rose
User
Beiträge: 57
Registriert: Dienstag 30. Oktober 2018, 11:34

macht er bei or nicht das eine oder das andere ? also er soll die Zeichenkette nur lexikografisch vergleichen falls sie gleichlang sind
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
d_rose
User
Beiträge: 57
Registriert: Dienstag 30. Oktober 2018, 11:34

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
d_rose
User
Beiträge: 57
Registriert: Dienstag 30. Oktober 2018, 11:34

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bei dem Code brauchst du immer noch kein String als Rückgabe. Das or reicht.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und warum die äußere Schleife kein for ist, erschließt sich mir auch nicht.
d_rose
User
Beiträge: 57
Registriert: Dienstag 30. Oktober 2018, 11:34

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
d_rose
User
Beiträge: 57
Registriert: Dienstag 30. Oktober 2018, 11:34

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

So hätte ich das deiner Beschreibung nach auch beschrieben. Wenn das nicht tut, ist das Problem woanders oder du hast nicht ausreichend spezifiziert.
d_rose
User
Beiträge: 57
Registriert: Dienstag 30. Oktober 2018, 11:34

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"]
Antworten