Nur Teil einer Liste an Funktion übergeben

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.
Antworten
bob666
User
Beiträge: 3
Registriert: Dienstag 30. April 2019, 08:37

Hallo Profis,

eine wohl einfache Frage, aber ich stehe wohl auf dem Schlauch - Ich habe eine Liste mit jeweils 4 Elementen in der Art

Code: Alles auswählen

colors = []
colors.append((150, 133, 50,  'Farbe1'))
colors.append((200, 140, 70,  'Farbe2'))
colors.append((200, 160, 60,  'Farbe3'))
die sortiert werden soll und zwar mit der rgb_to_hsv Funktion von colorsys, in der Art

Code: Alles auswählen

colors.sort(key=lambda rgb: colorsys.rgb_to_hsv(*rgb))
was wunderbar funktioniert, wenn die Liste nur 3 Argumente hat, aber wie übergebe ich eine Liste an eine fertige Funktion mit einer definierten Parameterzahl, ohne den 4. Parameter der Liste zu löschen, denn eine direkte Übergabe bringt natürlich den Fehler

Code: Alles auswählen

"rgb_to_hsv() takes 3 positional arguments but 4 were given"
Wenn ich versuche, den letzten Parameter zu entfernen

Code: Alles auswählen

[zeile[:3] for zeile in colors].sort(key=lambda rgb: colorsys.rgb_to_hsv(*rgb))
bringt er zwar keine Fehler, aber erstellt - meines Wissens ja - nur eine Kopie der Liste und sortiert die Originalliste nicht.

Zusammenfassend: Wie übergebe ich eine Liste mit x Parametern an eine fixe Funktion, die eine definierte Anzahl von Parametern hat, und erhalte als Rückgabewert wieder die sortierte Originalliste mit allen Werten - geht das überhaupt, oder muss ich die Originalfunktion kopieren und entsprechend ändern?

1000 Dank für jeden Tipp

Bob
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Zum ersten ist es unnoetig so viel zu schreiben, wenn man eine Liste von Tupeln will:

Code: Alles auswählen

colors = [
   (150, 133, 50,  'Farbe1'),
   (200, 140, 70,  'Farbe2'),
   (200, 160, 60,  'Farbe3')
]
Und zu deinem Problem: du hast doch schon in deiner Listcomprehension das richtige gemacht, naemlich den Wert per slicing auf die richtige Laenge gebracht. Nur an der falschen Stelle. Das funktioniert genauso in dem lambda:

Code: Alles auswählen

colors.sort(key=lambda rgb: colorsys.rgb_to_hsv(*rgb[:3]))
bob666
User
Beiträge: 3
Registriert: Dienstag 30. April 2019, 08:37

Ach Du meine Güte, Du hast natürlich Recht!

1000 Dank, manchmal sieht man die Lösung einfach nicht, wenn sie direkt vor den Augen ist! :)

Bob
Benutzeravatar
__blackjack__
User
Beiträge: 14042
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Vielleicht auch ein Fall von: Man sollte Variablen richtig benennen. Denn das was Du `rgb` genannt hast, ist ja nicht nur `rgb` sondern mehr. Dann wäre Dir an der Stelle vielleicht auch eingefallen das Du es *dort* machen musst um tatsächlich `rgb` zu bekommen. :-)
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
bob666
User
Beiträge: 3
Registriert: Dienstag 30. April 2019, 08:37

schuldig im Sinne der Anklage :D
Antworten