Seite 1 von 1

Nur Teil einer Liste an Funktion übergeben

Verfasst: Dienstag 30. April 2019, 09:02
von bob666
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

Re: Nur Teil einer Liste an Funktion übergeben

Verfasst: Dienstag 30. April 2019, 09:39
von __deets__
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]))

Re: Nur Teil einer Liste an Funktion übergeben

Verfasst: Dienstag 30. April 2019, 09:52
von bob666
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

Re: Nur Teil einer Liste an Funktion übergeben

Verfasst: Dienstag 30. April 2019, 10:07
von __blackjack__
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. :-)

Re: Nur Teil einer Liste an Funktion übergeben

Verfasst: Dienstag 30. April 2019, 10:24
von bob666
schuldig im Sinne der Anklage :D