Frage zu sorted

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
djangofish
User
Beiträge: 51
Registriert: Dienstag 16. Oktober 2012, 09:43
Kontaktdaten:

Hallo,

ich möchte gern eine Liste mit Listen sortieren

liste = [['aa','bb',1],['cc','dd',2]]

ich möchste diese Liste gern nach der Ziffer im letzten Feld sorieren und zwar absteigend. Mit dem normalen sorted geht es nicht, weil es lieber einen String hätte. Ich habe noch die Erweiterung natsorted gefunden, jedoch sortiert dies nur aufsteigend. Ein Keyword für Sortierung ist nicht vorgesehen.

Code: Alles auswählen

results = natsort.natsorted(results, key=itemgetter(len(results[0])-1))
Hat jemand einen Tipp? In Python3 wäre es schön:)

Danke
Peter
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mit itemgetter geht das ganz prima.

Code: Alles auswählen

>>> from operator import itemgetter
>>> liste = [['aa','bb',1],['cc','dd',2],['ee','ff',0]]
>>> liste.sort(key=itemgetter(2), reverse=True)
>>> liste
[['cc', 'dd', 2], ['aa', 'bb', 1], ['ee', 'ff', 0]]
Wenn es explizit das letzte Element der inneren Liste sein soll, dann bietet sich lambda an.

Code: Alles auswählen

>>> liste = [['aa','bb',1],['cc','dd',2],['ee','ff','gg',0]]
>>> liste.sort(key=lambda x: x[-1], reverse=True)
>>> liste
[['cc', 'dd', 2], ['aa', 'bb', 1], ['ee', 'ff', 'gg', 0]]
Nachtrag: Wie ein kurzes Experiment zeigt geht itemgetter(-1) auch. Das kannte ich bisher nicht. Wieder was hinzugelernt.
Zuletzt geändert von /me am Mittwoch 11. Juni 2014, 21:22, insgesamt 1-mal geändert.
djangofish
User
Beiträge: 51
Registriert: Dienstag 16. Oktober 2012, 09:43
Kontaktdaten:

Ah!

Vielen Dank
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

/me hat geschrieben: Nachtrag: Wie ein kurzes Experiment zeigt geht itemgetter(-1) auch. Das kannte ich bisher nicht. Wieder was hinzugelernt.
Ich danke Dir - wusste ich auch noch nicht :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

Es geht auch ``itemgetter('spam')`` zum Beispiel wenn man es dann auf Wörterbücher anwendet. Was immer man dort angibt wird halt einfach weitergegeben:

Code: Alles auswählen

In [8]: operator.itemgetter('answer')({'answer': 42})
Out[8]: 42
Das man -1 angeben kann ist also keine Frage von `itemgetter()` sondern von den Objekten auf die das angewendet wird. Wenn die mit ``obj[-1]`` klar kommen, dann kann man das auch übergeben.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:Das man -1 angeben kann ist also keine Frage von `itemgetter()` sondern von den Objekten auf die das angewendet wird. Wenn die mit ``obj[-1]`` klar kommen, dann kann man das auch übergeben.
Die Beschreibung zu itemgetter in der Dokumentation ist da auch ziemlich eindeutig. Vielleicht lernt ja nach dem Lesen der Dokumentation jetzt noch jemand, dass man itemgetter auch noch mehrere Parameter übergeben kann. :D
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

/me hat geschrieben:Vielleicht lernt ja nach dem Lesen der Dokumentation jetzt noch jemand, dass man itemgetter auch noch mehrere Parameter übergeben kann. :D
Oder andere:

Code: Alles auswählen

>>> slicer = itemgetter(slice(1, 4, 2))
>>> slicer([3, 4, 5, 6, 7])
[4, 6]
In specifications, Murphy's Law supersedes Ohm's.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

pillmuncher hat geschrieben:
/me hat geschrieben:Vielleicht lernt ja nach dem Lesen der Dokumentation jetzt noch jemand, dass man itemgetter auch noch mehrere Parameter übergeben kann. :D
Oder andere:
Wie BlackJack schon schrieb: Man kann alles übergeben (und so viele wie man möchte) was die __getitem__-Methode der Sequenz schluckt. Egal ob nun Integer, Slices, Bilder von Katzen oder was sonst noch so für Indizes rumfliegen :D
Das Leben ist wie ein Tennisball.
Antworten