Erste Liste nach der zweiten sortieren

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
samid
User
Beiträge: 60
Registriert: Samstag 28. April 2012, 08:40

Hallo zusammen,

ich folgendes Problem, und komm einfach nicht drauf wie ich es anstellen soll:

Input:

Code: Alles auswählen

lst_1 = [2, 3, 1]
lst_2 =[[2,0,0],[3,0,0],[1,0,0]]
Output nach dem sortieren der lst_2 ohne die lst_1 zu sortieren:

Code: Alles auswählen

lst_1 = [1, 2, 3]
lst_2 = [[1,0,0], [2,0,0], [3,0,0]] 
Hier noch ein praxisbezogenes Beispiel:
In der ersten Liste habe ich Linien und in der zweiten Liste habe ich die Koordinaten der Linienstartpunkte. Jetzt will ich die Linien nach dem aufsteigenden X-Wert sortieren. Wie gehe ich da am besten vor?

Danke für die Antworten
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Die sort-Methode auf Listen hat eine key-Argument, das solltest du dir mal anschauen. Am besten erstellst du eine Liste aus lst_1 und lst_2 (zip(lst_1, lst_2)) und sortierst diese dann entsprechend. Danach extrahierst du dann die Daten wieder aus der Liste.
Das Leben ist wie ein Tennisball.
samid
User
Beiträge: 60
Registriert: Samstag 28. April 2012, 08:40

Ahh. Ok, ich werde mir mal den Key anschauen. Danke.
BlackJack

@samid: So etwas ist der Grund warum man zusammengehörende Daten nicht in „parallelen” Datenstrukturen ablegen sollte, sondern zusammen in einer Datenstruktur.
samid
User
Beiträge: 60
Registriert: Samstag 28. April 2012, 08:40

Danke für die Antwort BlackJack.
Aber gerade diese eine Datenstruktur versuche ich ja damit auch zu erstellen.
Ich habe es folgendermaßen gelöst:

Code: Alles auswählen

lst_3 = [item for item in zip(lst_1,lst_2)]
lst_3.sort(key = lambda x: x[1][0])
Jetzt habe ich gehört das anstatt lambda auch operator.itemgetter eingesetzt werden kann, nur komme ich nicht drauf wie ich:

Code: Alles auswählen

lambda x: x[1][0]
in operator.itemgetter umwandeln kann.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

lst_3.sort(key=operator.itemgetter(1, 0))
Dein

Code: Alles auswählen

lst_3 = [item for item in zip(lst_1,lst_2)]
ist nur kompliziert für

Code: Alles auswählen

zip(lst_1, lst_2)
solltest du Python 3.x verwenden, dann einfach

Code: Alles auswählen

list(zip(lst_1, lst_2))
Das Leben ist wie ein Tennisball.
samid
User
Beiträge: 60
Registriert: Samstag 28. April 2012, 08:40

Danke.
samid
User
Beiträge: 60
Registriert: Samstag 28. April 2012, 08:40

Jetzt habe ich es mit dem itemgetter ausprobiert. Nun geht es irgendwie nicht die Liste lst_3 nach dem index [1][2] zu sortieren. Ist:

Code: Alles auswählen

key = lambda x: x[1][2]
dasselbe wie:

Code: Alles auswählen

key = operator.itemgetter(1,2)
?
deets

Lies doch einfach die Doku - da steht es.

http://docs.python.org/library/operator ... itemgetter

Oder probier es *aus*, in der Kommandozeile:

Code: Alles auswählen

>>> from operator import itemgetter
>>> l = [[1], [2]]
>>> itemgetter(1, 0)(l)
([2], [1])
samid
User
Beiträge: 60
Registriert: Samstag 28. April 2012, 08:40

Ok werde ich machen, ich finde die Doku etwas schwer zu lesen, da haben es andere Sprachen schon besser gelöst.
deets

Warum arbeitest du dann nicht mit diesen besser dokumentierten Sprachen?
samid
User
Beiträge: 60
Registriert: Samstag 28. April 2012, 08:40

:D
Sag mal was ist denn los. Fühlst du dich durch meine Fragen irgendwie genervt. Dafür sind doch die Foren da, um Fragen zu stellen. Oder?
Und das mit der Doku haben schon viele gemeint, dass es schwer zu lesen ist. Das hat aber nichts mit der Programmiersprache selbst zu tun.
Also ein Tip: Rauch erst mal eine Zigarette oder trink einen Tee bevor du dann auf meine Beiträge antwortest.

Gruß
Samid
deets

Na, was ist denn mit dir los? Bist du der einzige, der sachliche Fragen stellen kann? Ich habe nicht gesagt, du sollst Python nicht verwenden. Ich habe dich gefragt, warum du es einsetzt, wenn du andere Sprachen kennst, mit denen du besser klarkommst.

Foren sind doch zum Fragen stellen da - hat hier gerade wer geschrieben....
samid
User
Beiträge: 60
Registriert: Samstag 28. April 2012, 08:40

Gut gekontert
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hmm, da habe ich mich wohl nicht richtig an die Semantik von itemgetter erinnert.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

samid hat geschrieben:Ok werde ich machen, ich finde die Doku etwas schwer zu lesen, da haben es andere Sprachen schon besser gelöst.
Welche denn so? Ich finde die Doku von Python schon ziemlich gut - sowohl inhaltlich als auch strukturell!

@Problem: Denk noch mal über BlackJacks Aussage nach. Auf Dauer willst Du nicht zwei separate Strukturen pflegen...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hyperion hat geschrieben:Welche denn so? Ich finde die Doku von Python schon ziemlich gut - sowohl inhaltlich als auch strukturell!
Na die PHP-Doku wo es schlechten Beispielcode zum Copypasten in den Kommentaren gibt :) Oder hat sich das inzwischen verändert?

Hat sich das eigentliche Thema schon gelöst oder sind da noch Fragen offen? Weil das so mit ``lambda`` ist schon hässlich, so.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten