Trier les tuples en fonction du deuxième paramètre


93

J'ai une liste de tuples qui ressemblent à ceci:

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

Ce que je veux, c'est la liste triée par ordre croissant, par la deuxième valeur du tuple. Donc L [0] devrait être ("Person 2", 8)après le tri.

Comment puis-je faire ceci? Utilisation de Python 3.2.2 Si cela vous aide.


Réponses:


187

Vous pouvez utiliser le keyparamètre pour list.sort():

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

ou, légèrement plus rapide,

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

(Comme pour tout module, vous devrez import operatorpouvoir l'utiliser.)


3
J'ai essayé d'utiliser L.sort(key=operator.itemgetter(1))dans mon code, mais j'obtiens une NameError, cet «opérateur» n'est pas défini. Dois-je importer quelque chose de spécial?
user974703

3
A fait un peu de recherche, besoin d'utiliser import operatorpour utiliser la fonction. Si vous ajoutez cela à votre réponse, je le marquerai comme accepté.
user974703

Test avec timeit.timeit (options par défaut), il n'y a pas de différence énorme entre ces deux approches: operator.itemgetter = 1.05µs, lambda = 1.25µs par itération
Noel Evans

Merci pour la solution my_list.sort (key = operator.itemgetter (1)) !! :)
aman_novice

1
Si vous êtes nouveau sur le mot clé lambda: stackoverflow.com/questions/13669252/what-is-key-lambda
EchoLynx

12

Et si vous utilisez python 3.X, vous pouvez appliquer la sortedfonction sur la mylist. Ceci n'est qu'un ajout à la réponse que @Sven Marnach a donnée ci-dessus.

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

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

Ce n'est que le intégré qui renvoie une nouvelle liste. Votre réponse ne contribue en rien à celles déjà ici, car il est clair que si vous vouliez une nouvelle liste, vous utiliseriez à la sortedplace list.sort.
miradulo

2
@SamuelNde J'ai fait défiler vers le bas ici parce que je n'étais pas sûr que l'expression fonctionnait de la même manière pour trié, donc cela m'a aidé.
Le Chaperon Rouge

Ouais d'accord, cela m'a aidé aussi
StackG

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

sortie -> Rogue One


Quelques réflexions: cela ne répond pas réellement à la question (comment obtenir une liste triée par une valeur dans le tuple); Vous pouvez décompresser le tuple directement dans votre boucle (pour le film, valeur dans listoftuples:); vous avez remplacé le type «tuple»; Et cela peut en fait être fait est une compréhension de liste unique: (retour trié ((valeur, film) pour le film, valeur dans listoftuples) [- 1] [1])
RFox

J'apprécie ce que vous recherchez, mais je dirais que cela manque d'élégance et pourrait être amélioré. En général, il serait considéré comme une mauvaise pratique de transformer l'ordre des éléments dans un tupple comme celui-ci. Je pense que les points concernant la compréhension des listes et le déballage des tupples seraient toujours d'actualité. Et je découragerais quiconque d'utiliser cette méthodologie sur la réponse acceptée.
RFox

Je suis incapable et je n'ai pas pu obtenir le code que vous avez publié au travail, probablement une erreur d'utilisateur
Darrell White

mais l'a changé un peu et sans doute votre réponse est 200 fois meilleure.
Darrell White

def findMaxSales (listoftuples): newlist = sorted ((value, movies) for movies, value in listoftuples) return newlist [-1] [1] 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)] imprimer (findMaxSales (movieList))
Darrell White
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.