wake-up-neo.com

Wie sortiere ich (Liste / Tupel) von Listen / Tupeln nach dem Element an einem bestimmten Index?

Ich habe einige Daten entweder in einer Liste von Listen oder einer Liste von Tupeln, wie folgt:

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, nach 2,5,8 sortieren, wobei 2 von (1,2,3) stammt, 5 von (4,5,6) stammt. Was ist der übliche Weg, um dies zu tun? Soll ich Tupel oder Listen in meiner Liste speichern?

545
Stan
sorted_by_second = sorted(data, key=lambda tup: tup[1])

oder:

data.sort(key=lambda tup: tup[1])  # sorts in place
956
Stephen
from operator import itemgetter
data.sort(key=itemgetter(1))
193
manova

Ich möchte nur zu Stephens Antwort hinzufügen, wenn Sie das Array von hoch nach niedrig sortieren möchten. Eine andere Möglichkeit als in den obigen Kommentaren besteht darin, Folgendes zur Zeile hinzuzufügen:

reverse = True

und das Ergebnis wird wie folgt sein:

data.sort(key=lambda tup: tup[1], reverse=True)
46
sifoo

Zum Sortieren nach mehreren Kriterien, nämlich beispielsweise nach dem zweiten und dritten Element in einem Tupel, sei

data = [(1,2,3),(1,2,1),(1,1,4)]

definieren Sie daher ein Lambda, das beispielsweise ein Tupel zurückgibt, das die Priorität beschreibt

sorted(data, key=lambda tup: (tup[1],tup[2]) )
[(1, 1, 4), (1, 2, 1), (1, 2, 3)]
33
elm

Stephens Antwort ist die, die ich verwenden würde. Der Vollständigkeit halber hier das Muster DSU (dekorieren, sortieren, undekorieren) mit Listenverständnissen:

decorated = [(tup[1], tup) for tup in data]
decorated.sort()
undecorated = [tup for second, tup in decorated]

Oder knapper:

[b for a,b in sorted((tup[1], tup) for tup in data)]

Wie im Python Sorting HowTo angegeben, ist dies seit Python 2.4, als die wichtigsten Funktionen verfügbar wurden, nicht mehr erforderlich.

27
tcarobruce

So sortieren Sie eine 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 benutze diese Methode:

sorted(data, key=lambda tup:(-tup[1], tup[0]))

und es gibt mir das Ergebnis:

[('butter', 2),
('a', 1),
('betty', 1),
('bit', 1),
('bitter', 1),
('bought', 1),
('but', 1),
('of', 1),
('the', 1),
('was', 1)]
16
l mingzhi

Ohne Lambda:

def sec_elem (s): 
 return s [1] 
sortiert (Daten, Schlüssel = sec_elem) 
10
Mesco

@ Stephens Antwort ist auf den Punkt! Hier ist ein Beispiel für eine bessere Visualisierung,

Grüße die Fans von Ready Player One! =)

>>> 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')]

key ist eine Funktion, die aufgerufen wird, um die Elemente der Sammlung zum Vergleich zu transformieren. Dies entspricht der Methode compareTo in Java.

Der an key übergebene Parameter muss aufrufbar sein. Hier erzeugt die Verwendung von lambda eine anonyme Funktion (die aufrufbar ist).
Die Syntax von Lambda ist das Wort Lambda, gefolgt von einem iterablen Namen und einem einzelnen Codeblock.

Im folgenden Beispiel wird eine Liste mit Tupeln sortiert, die Informationen zur Uhrzeit eines bestimmten Ereignisses und zum Namen des Akteurs enthält.

Wir sortieren diese Liste nach dem Zeitpunkt des Eintretens eines Ereignisses - dem 0. Element eines Tupels.

Hinweis - s.sort([cmp[, key[, reverse]]]) sortiert die vorhandenen Elemente

6
Rishi

itemgetter() ist etwas schneller als lambda tup: tup[1], aber der Anstieg ist relativ gering (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
5
Walter