Sortiren einer Liste von dictionaries die Listen enthalten.

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
HimbeerVanille
User
Beiträge: 2
Registriert: Donnerstag 2. Februar 2012, 16:57

Hallo,

ich habe folge Ausgangslage:

ich habe eine Liste A bestehend aus dictionaries.
die dictionaries haben folgende Form:

Code: Alles auswählen

{'coordinates': (x, y, z), 'Name': 'Part-1-1', 'label': 1}
Jetzt möchte ich die Liste A sortieren zuerst nach dem kleinsten x, bei gleichem x nach y usw.

Bsp.:

Code: Alles auswählen

A=[{'coordinates': (1, 1, 0), 'Name': 'Part-1-1', 'label': 1}, 
{'coordinates': (2, 1, 0), 'Name': 'Part-1-1', 'label': 2}, 
{'coordinates': (1, 2, 0), 'Name': 'Part-1-1', 'label': 3}, 
{'coordinates': (2, 2, 0), 'Name': 'Part-1-1', 'label': 4}]
Ergebnis:

Code: Alles auswählen

A=[{'coordinates': (1, 1, 0), 'Name': 'Part-1-1', 'label': 1}, 
{'coordinates': (1, 2, 0), 'Name': 'Part-1-1', 'label': 3}, 
{'coordinates': (2, 1, 0), 'Name': 'Part-1-1', 'label': 2}, 
{'coordinates': (2, 2, 0), 'Name': 'Part-1-1', 'label': 4}]
Wie kann ich python sagen, dass er bei der Sortierung die Werte der Liste Coordinates benutzt?

Danke
deets

liste.sort(key=lambda d: d["coordinates"])
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du kannst der Funktion ``sorted`` eine Funktion übergeben, die einen "Vergleichswert" aus einer komplexeren Datenstruktur herausfiltert:

Code: Alles auswählen

>>> from pprint import pprint
>>> pprint(sorted(A, key=lambda d: d["coordinates"]))
[{'Name': 'Part-1-1', 'coordinates': (1, 1, 0), 'label': 1},
 {'Name': 'Part-1-1', 'coordinates': (1, 2, 0), 'label': 3},
 {'Name': 'Part-1-1', 'coordinates': (2, 1, 0), 'label': 2},
 {'Name': 'Part-1-1', 'coordinates': (2, 2, 0), 'label': 4}]
Edit: Ok, auf der ``sort``-methode von ``list`` funzt das natürlich genauso.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
HimbeerVanille
User
Beiträge: 2
Registriert: Donnerstag 2. Februar 2012, 16:57

Danke für eure schnellen Antworten. Ich werde es gleich mal ausprobieren.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Äquivalent funktioniert als `key`-Argument auch

Code: Alles auswählen

operator.itemgetter('coordinates')
Antworten