[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