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.

user974703
la source
1
duplication possible de Trier un tuple qui contient des tuples
JBernardo

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

Sven Marnach
la source
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]) 
Samuel Nde
la source
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

Darrell White
la source
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