Python >> Tutoriel Python >  >> Python

Comment trier une liste de tuples ? - La manière la plus pythonique !

Avez-vous déjà essayé de trier une liste de tuples ? Et quand vous avez vu le résultat, ce n'était pas tout à fait ce à quoi vous vous attendiez ? Eh bien, cela m'est arrivé lorsque j'ai approfondi Python, et je suppose que cela vous est également arrivé puisque vous cherchez une solution. Pour moi, cela montre que vous êtes un programmeur Python avancé !

Réponse rapide

Utiliser le sorted() intégré de Python fonction ou appeler la méthode sort() sur la liste que vous souhaitez trier. Les deux ont un paramètre facultatif key qui attend une fonction. Passez une fonction ici, qui calcule une valeur-clé à partir de chaque tuple de la liste pour trier les tuples en fonction de leurs valeurs-clés calculées. Exemple de tri d'une liste de tuples par leur deuxième entrée :

lst = [(1, 2), (2, 3), (0, 3)]
lst.sort(key=lambda x: x[1])

Exercice :Ajouter un print() déclaration et imprime l'état de la liste d'origine lst .

Comment trier une liste de tuples par n'importe quel élément ou valeur personnalisée ?

Encadrons d'abord notre problème plus en détail :nous avons une liste de tuples que nous voulons trier par leur deuxième élément ou somme d'éléments ou toute autre chose qui n'est pas le premier élément de la liste. Le comportement par défaut des deux sort() et sorted() est d'utiliser la première entrée de chaque tuple comme critère de tri. C'est ce qui peut réserver des surprises aux débutants.

Supposons que nous souhaitions trier une liste d'éléments comme celle-ci :

items = [
   ("apple", 1.5),
   ("pear", 2.3),
   ("egg", 0.5),
   ("cherry", 0.2),
]

Nous pourrions soit trier les tuples par leur premier élément, qui est le nom, soit par leur deuxième élément, le prix de l'article. Pour y parvenir, nous pourrions écrire une fonction de tri personnalisée. Mais ce ne serait pas très Pythonique.

Au lieu de cela, nous voulons utiliser les fonctions intégrées fournies par Python. Par conséquent, nous avons plusieurs options :

  1. appelez le sort() sur la liste via items.sort()
  2. utiliser sorted() pour trier la liste via sorted_items = sorted(items)

La différence entre les deux options est que la première trie la liste en place et la seconde crée une nouvelle instance de liste et ajoute les éléments triés à cette nouvelle instance. Ainsi, dans les deux cas, vous vous retrouvez avec une liste triée. Si vous avez besoin de conserver l'état initial de la liste, utilisez sorted()  dans tous les autres cas, préférez appeler le  sort() directement sur la liste. Dans les deux cas, la liste sera triée selon la valeur par défaut de Python :la première entrée de chaque tuple.

Pour remplacer le comportement par défaut, nous utilisons la clé de paramètre facultative qui est fournie à la fois par sort() et sorted() . La clé de paramètre attend une fonction capable de calculer une valeur à partir d'un tuple. Il est très courant d'utiliser un lambda pour remplacer le comportement par défaut. Si vous n'êtes pas encore familier avec les lambdas de Python, lisez toutes les connaissances de base dans cet article.

Pour trier les éléments de la liste par la deuxième entrée des tuples, nous écrivons :

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


ou si vous souhaitez conserver l'ordre initial des articles :

new_list = sorted(items, key=lambda x: x[1])

Notre fonction clé prend un tuple x et renvoie sa deuxième entrée, ainsi, l'ordre final de la liste ne prendra en compte que la deuxième entrée de chaque tuple. On pourrait aussi écrire :

items.sort(key=lambda x: sum(x))


pour trier les tuples par la somme de leurs entrées. Bien sûr, cela ne s'applique pas à notre exemple, puisque les entrées de nos tuples sont des chaînes et des entiers.

Enfin, il est également important de connaître le comportement par défaut de Python pour le tri des listes de tuples. Cela n'a aucun sens d'écrire :

items.sort(key=lambda x: x[0])

car c'est exactement ce que fait le comportement par défaut.

Pour résumer, regardez cette vidéo :

Conclusion

Python fournit tout ce dont vous avez besoin pour trier facilement des listes de tuples sans écrire de fonctions de tri personnalisées. Tout ce que vous avez à faire est de définir la fonction clé qui calcule une valeur pour chaque tuple par lequel ils doivent être triés.