913 Stimmen

Wie sortiert man eine Liste/ein Tupel von Listen/Tupeln nach dem Element mit einem bestimmten Index?

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, Sortierung nach 2,5,8, wobei 2 ist von (1,2,3) , 5 ist von (4,5,6) . Wie kann man das üblicherweise tun? Sollte ich Tupel oder Listen in meiner Liste speichern?

80 Stimmen

Was die Frage "Soll ich Tupel oder Listen in meiner Liste speichern?" betrifft, so gilt als Faustregel, dass die Dinge so unveränderlich wie möglich sein sollten. Wenn Sie das nicht tun brauchen um die Unterlisten an Ort und Stelle zu ändern und sie zu Tupeln zu machen.

29voto

Ferris Punkte 4767

Um eine Liste von Tupeln zu sortieren (<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 ich erhalte das Ergebnis:

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

16voto

Mesco Punkte 997

Ohne lambda:

def sec_elem(s):
    return s[1]

sorted(data, key=sec_elem)

11voto

Walter Punkte 397

itemgetter() ist etwas schneller als lambda tup: tup[1] Der Anstieg ist jedoch relativ bescheiden (etwa 10 bis 25 %).

(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

7voto

Rishi Punkte 5263

Die Antwort von @Stephen ist auf den Punkt gebracht! Hier ist ein Beispiel zur besseren Veranschaulichung,

Ein Hoch auf 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 für den Vergleich umzuwandeln wie compareTo Methode in Java.

Der an key übergebene Parameter muss ein aufrufbarer Parameter sein. Hier ist die Verwendung von lambda erstellt eine anonyme Funktion (die ein Callable ist).
Die Syntax von lambda besteht aus dem Wort lambda, gefolgt von einem iterierbaren Namen und einem einzelnen Codeblock.

Im folgenden Beispiel sortieren wir eine Liste von Tupeln, die Informationen über den Zeitpunkt eines bestimmten Ereignisses und den Namen eines Akteurs enthalten.

Wir sortieren diese Liste nach dem Zeitpunkt des Auftretens des Ereignisses - das ist das 0. Element eines Tupels.

Hinweis - s.sort([cmp[, key[, reverse]]]) sortiert die Artikel von s an Ort und Stelle

1voto

stackOverflow Punkte 23

Ich verwende dies in meinem Code:

#To sort the list based on each element's second integer (elem[1])
sorted(d2, key=lambda elem: elem[1])

Je nachdem, nach welchem Element Sie sortieren möchten, können Sie es in die

(elem[*insert the index of the element you are sorting it by*])

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X