Sortieren Sie Tupel nach dem zweiten Parameter


89

Ich habe eine Liste von Tupeln, die ungefähr so ​​aussehen:

("Person 1",10)
("Person 2",8)
("Person 3",12)
("Person 4",20)

Was ich produzieren möchte, ist die Liste in aufsteigender Reihenfolge nach dem zweiten Wert des Tupels sortiert. Also sollte L [0] sein("Person 2", 8) nach dem Sortieren sein.

Wie kann ich das machen? Verwenden von Python 3.2.2 Wenn das hilft.


Antworten:


183

Sie können den keyParameter verwenden, um list.sort():

my_list.sort(key=lambda x: x[1])

oder etwas schneller

my_list.sort(key=operator.itemgetter(1))

(Wie bei jedem Modul müssen Sie import operatores verwenden können.)


3
Ich habe versucht, L.sort(key=operator.itemgetter(1))in meinem Code zu verwenden, aber ich erhalte einen NameError, der 'Operator' ist nicht definiert. Muss ich etwas Besonderes importieren?
user974703

3
Habe ein bisschen gesucht, muss verwenden import operator, um die Funktion zu nutzen. Wenn Sie das zu Ihrer Antwort hinzufügen, werde ich es als akzeptiert markieren.
user974703

Beim Testen mit timeit.timeit (Standardoptionen) gibt es keinen großen Unterschied zwischen diesen beiden Ansätzen: operator.itemgetter = 1,05µs, Lambda = 1,25µs ​​pro Iteration
Noel Evans

Vielen Dank für die Lösung my_list.sort (key = operator.itemgetter (1)) !! :)
aman_novice

1
Wenn Sie neu im Lambda-Schlüsselwort sind: stackoverflow.com/questions/13669252/what-is-key-lambda
EchoLynx

8

Und wenn Sie Python 3.X verwenden, können Sie die sortedFunktion auf die Mylist anwenden. Dies ist nur eine Ergänzung zu der Antwort, die @Sven Marnach oben gegeben hat.

# using *sort method*
mylist.sort(lambda x: x[1]) 

# using *sorted function*
sorted(mylist, key = lambda x: x[1]) 

Dies ist nur die integrierte Funktion, die eine neue Liste zurückgibt. Ihre Antwort trägt nichts zu den bereits hier gegebenen bei, da es klar ist, dass Sie, wenn Sie eine neue Liste wollten, sortedstattdessen verwenden würden list.sort.
Miradulo

2
@SamuelNde Ich habe hier nach unten gescrollt, weil ich nicht sicher war, ob der Ausdruck für sortiert gleich funktioniert, also hat es mir geholfen.
Rotkäppchen

-1
    def findMaxSales(listoftuples):
        newlist = []
        tuple = ()
        for item in listoftuples:
             movie = item[0]
             value = (item[1])
             tuple = value, movie

             newlist += [tuple]
             newlist.sort()
             highest = newlist[-1]
             result = highest[1]
       return result

             movieList = [("Finding Dory", 486), ("Captain America: Civil                      

             War", 408), ("Deadpool", 363), ("Zootopia", 341), ("Rogue One", 529), ("The  Secret Life of Pets", 368), ("Batman v Superman", 330), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)]
             print(findMaxSales(movieList))

Ausgabe -> Rogue One


Ein paar Gedanken: Dies beantwortet die Frage nicht wirklich (wie man eine Liste nach einem Wert im Tupel sortiert); Sie können das Tupel direkt in Ihre Schleife entpacken (für Film Wert in listoftuples :); Sie haben den Typ 'Tupel' überschrieben. Und es kann tatsächlich getan werden, ist ein einzelnes Listenverständnis: (Rückgabe sortiert ((Wert, Film) für Film, Wert in listoftuples) [- 1] [1])
RFox

Ich weiß zu schätzen, was Sie wollen, aber ich würde argumentieren, dass es an Eleganz mangelt und verbessert werden könnte. Im Allgemeinen würde es als schlechte Praxis angesehen, die Reihenfolge der Elemente in einem solchen Tupple zu transformieren. Ich denke, die Punkte zum Listenverständnis und zum Auspacken von Tupples würden immer noch bestehen bleiben. Und ich würde jeden davon abhalten, diese Methode über die akzeptierte Antwort anzuwenden.
RFox

Ich bin unfähig und konnte den von Ihnen geposteten Code nicht zum Laufen bringen, höchstwahrscheinlich ein Benutzerfehler
Darrell White

aber änderte es ein wenig und ohne Zweifel ist Ihre Antwort 200x besser.
Darrell White

def findMaxSales (listoftuples): newlist = sortiert ((Wert, Filme) für Filme, Wert in listoftuples) return newlist [-1] [1] movieList = [("Finding Dory", 486), ("Captain America: Civil War" ", 408), (" Deadpool ", 363), (" Zootopia ", 341), (" Rogue One ", 529), (" Das geheime Leben der Haustiere ", 368), (" Batman gegen Superman ", 330 ), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)] print (findMaxSales (movieList))
Darrell White
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.