[Python-de] sorting by keys

Peter Otten __peter__ at web.de
Mit Aug 23 10:24:40 CEST 2006


Am Freitag, 18. August 2006 16:12 schrieb joerg krebs:

> Ich verwende die Methode:
>
> L = [('c', 2), ('d', 1), ('a', 4), ('b', 3)]
> sorted(L, key=operator.itemgetter(1))
> [('d', 1), ('c', 2), ('b', 3), ('a', 4)]
>
> um eine Liste(L) zu sortieren.
>
> Hat jemand eine Idee, wie man mehrstellige Zahlen sortieren als keys
> sortieren kann ??
>
> Also z.B.
> L = [('c', 2), ('d', 10), ('a', 4), ('b', 3)
>
> nach obiger:
> [('d', 10), ('c', 2), ('b', 3), ('a', 4)]
>
> ich haette aber gerne
> [('c', 2), ('b', 3), ('a', 4),('d', 10)]

Um es noch mal deutlich zu sagen: Deine Problembeschreibung ist falsch. Du 
kriegst, was du gerne hättest:

>>> from operator import itemgetter
>>> items = [("d", 10), ("c", 2), ("b", 3), ("a", 4)]
>>> items.sort(key=itemgetter(1))
>>> items
[('c', 2), ('b', 3), ('a', 4), ('d', 10)]

Vermutlich hast du mit Strings statt Zahlen gearbeitet als du auf das 
unerwartete Ergebnis der Sortierung gestoßen bist:

>>> items = [("d", "10"), ("c", "2"), ("b", "3"), ("a", "4")]
>>> items.sort(key=itemgetter(1))
>>> items
[('d', '10'), ('c', '2'), ('b', '3'), ('a', '4')]

Um Strings numerisch zu sortieren, musst du sie in Zahlen umwandeln, z. B.:

>>> def key(t):
...     try:
...             return int(t[1])
...     except ValueError:
...             return t[1]
...
>>> items = [("a", "a"), ("d", "10"), ("c", "2"), ("b", "3"), ("a", "4")]
>>> items.sort(key=key)
>>> items
[('c', '2'), ('b', '3'), ('a', '4'), ('d', '10'), ('a', 'a')]

[Jörg Krebs, später]

> ich glaube ich habe die Antwort auf mein Frage selber gefunden:
> L.sort(lambda a, b: a[1]-b[1])
>
> funktioniert zumindest fuer mehrelementige Listen von Listen, also z.B.
> L = [['c', 2], ['d', 10], ['a', 4], ['b', 3]]
> L.sort(lambda a, b: a[1]-b[1])
> [['c', 2], ['b', 3], ['a', 4],['d', 10]]

Das funktioniert (bei Zahlen) auch, ist aber viel ineffizienter.
Aber das hast du inzwischen bestimmt alles selber rausgekriegt...

Peter




More information about the python-de mailing list