Ich habe einige Daten entweder in einer Liste von Listen oder einer Liste von Tupeln, wie diese:
data = [[1,2,3], [4,5,6], [7,8,9]]
data = [(1,2,3), (4,5,6), (7,8,9)]
Und ich möchte nach dem 2. Element in der Teilmenge sortieren. Das heißt, ich möchte nach 2,5,8 sortieren, wobei 2
aus (1,2,3)
und 5
aus (4,5,6)
stammt. Wie kann man das üblicherweise tun? Sollte ich Tupel oder Listen in meiner Liste speichern?
Ich möchte nur der Antwort von Stephen's hinzufügen, wenn Sie das Array von hoch nach niedrig sortieren wollen, eine andere Möglichkeit als in den obigen Kommentaren besteht darin, dies einfach in die Zeile einzufügen:
reverse = True
und das Ergebnis wird wie folgt aussehen:
data.sort(key=lambda tup: tup[1], reverse=True)
Um nach mehreren Kriterien zu sortieren, nämlich zum Beispiel nach dem zweiten und dritten Element in einem Tupel, lassen Sie
data = [(1,2,3),(1,2,1),(1,1,4)]
und so ein Lambda definieren, das ein Tupel zurückgibt, das die Priorität beschreibt, zum Beispiel
sorted(data, key=lambda tup: (tup[1],tup[2]) )
[(1, 1, 4), (1, 2, 1), (1, 2, 3)]
Stephen's answer ist die, die ich verwenden würde. Der Vollständigkeit halber hier das DSU (decorate-sort-undecorate) Muster mit Listenauffassungen:
decorated = [(tup[1], tup) for tup in data]
decorated.sort()
undecorated = [tup for second, tup in decorated]
Oder, etwas kürzer formuliert:
[b for a,b in sorted((tup[1], tup) for tup in data)]
Wie im Python Sorting HowTo erwähnt, ist dies seit Python 2.4, als die Schlüsselfunktionen verfügbar wurden, nicht mehr notwendig.
Zum Sortieren einer Liste von Tupeln (<word>, <count>)
, für count
in absteigender Reihenfolge und word
in alphabetischer Reihenfolge:
data = [
('betty', 1),
('bought', 1),
('a', 1),
('bit', 1),
('of', 1),
('butter', 2),
('but', 1),
('the', 1),
('was', 1),
('bitter', 1)]
Ich verwende diese Methode:
sorted(data, key=lambda tup:(-tup[1], tup[0]))
und es liefert mir das Ergebnis:
[('butter', 2),
('a', 1),
('betty', 1),
('bit', 1),
('bitter', 1),
('bought', 1),
('but', 1),
('of', 1),
('the', 1),
('was', 1)]
Ohne Lambda:
def sec_elem(s): Rückgabe s[1]
sortiert(Daten, Schlüssel=sec_elem)
itemgetter()
ist etwas schneller als lambda tup: tup[1]
, aber der Anstieg ist relativ bescheiden (etwa 10 bis 25 Prozent).
(IPython-Sitzung)
>>> from operator import itemgetter
>>> from numpy.random import randint
>>> values = randint(0, 9, 30000).reshape((10000,3))
>>> tpls = [tuple(values[i,:]) for i in range(len(values))]
>>> tpls[:5] # display sample from list
[(1, 0, 0),
(8, 5, 5),
(5, 4, 0),
(5, 7, 7),
(4, 2, 1)]
>>> sorted(tpls[:5], key=itemgetter(1)) # example sort
[(1, 0, 0),
(4, 2, 1),
(5, 4, 0),
(8, 5, 5),
(5, 7, 7)]
>>> %timeit sorted(tpls, key=itemgetter(1))
100 loops, best of 3: 4.89 ms per loop
>>> %timeit sorted(tpls, key=lambda tup: tup[1])
100 loops, best of 3: 6.39 ms per loop
>>> %timeit sorted(tpls, key=(itemgetter(1,0)))
100 loops, best of 3: 16.1 ms per loop
>>> %timeit sorted(tpls, key=lambda tup: (tup[1], tup[0]))
100 loops, best of 3: 17.1 ms per loop
@Stephen 's Antwort ist auf den Punkt gebracht! Hier ist ein Beispiel für eine bessere Visualisierung,
Rufen Sie die Fans des Ready Player One an! =)
>>> gunters = [('2044-04-05', 'parzival'), ('2044-04-07', 'aech'), ('2044-04-06', 'art3mis')]
>>> gunters.sort(key=lambda tup: tup[0])
>>> print gunters
[('2044-04-05', 'parzival'), ('2044-04-06', 'art3mis'), ('2044-04-07', 'aech')]
Taste
ist eine Funktion, die aufgerufen wird, um die Elemente der Sammlung's zum Vergleich zu transformieren.
wie die Methode compareTo
in Java.
Der an key übergebene Parameter muss etwas sein, das aufrufbar ist.
Hier erzeugt die Verwendung von lambda
eine anonyme Funktion (die aufrufbar ist).
Die Syntax von "Lambda" ist das Wort "Lambda", gefolgt von einem iterierbaren Namen und einem einzelnen Code-Block.
Im folgenden Beispiel sortieren wir eine Liste von Tupeln, die die Information über die Zeit eines bestimmten Ereignisses und den Namen eines Schauspielers enthalten.
Wir sortieren diese Liste nach der Zeit des Auftretens des Ereignisses - das ist das 0. Element eines Tupels.
Anmerkung - s.sort([cmp[, key[, reverse]]]])
sortiert die Elemente von s an Ort und Stelle