Python >> Tutoriel Python >  >> Python

Fonction Python triée()

Si vous travaillez dans une carrière axée sur les données, il y a de fortes chances que vous deviez à un moment donné effectuer un tri sur vos données. Plutôt que d'écrire votre propre algorithme de tri (qui sera probablement beaucoup moins efficace), Python fournit une fonction intégrée appelée sorted() . Cette fonction vous permet d'effectuer un tri de base, comme le classement par ordre croissant ou alphabétique, mais a également la possibilité d'effectuer un tri personnalisé, dans lequel vous pouvez trier selon vos propres spécifications.

Définition

Le sorted() La fonction prend une entrée itérable spécifiée et renvoie une liste triée.

Par exemple :

>>> x = [4, 1, 2]
>>> sorted(x)
[1, 2, 4]

Il est important de noter que le sorted() la fonction ne modifie pas la liste d'origine x; il crée une nouvelle liste qui peut être stockée dans une variable séparée.

Paramètres

Le sorted() la fonction prend au plus 3 arguments :

sorted(iterable, key = None, reverse = False)
  • iterable :Il s'agit de la séquence à trier. Il accepte plusieurs types de données tels qu'une chaîne, une liste, un tuple, un dictionnaire, etc. et inclut des listes imbriquées. Cependant, quel que soit le type de données saisies, le sorted() retournera toujours une liste.
  • key :Ceci est un argument facultatif dans le sorted() fonction avec la valeur par défaut étant None . Le paramètre clé vous permet de saisir une fonction (intégrée ou votre propre fonction) afin de personnaliser le tri de votre liste.
  • reverse :Il s'agit d'un argument facultatif qui indique si les données doivent être triées par ordre croissant ou décroissant. L'argument par défaut est False , ce qui signifie que les données seront triées par ordre croissant.

Trier les chaînes

Lors du tri des chaînes, la valeur par défaut consiste à organiser chaque caractère de la chaîne dans l'ordre croissant et à renvoyer une liste de ces caractères.

Exemple 1 :une chaîne de mots unique

>>> word = 'Python'
>>> sorted(word)
['P', 'h', 'n', 'o', 't', 'y']

Exemple 2 :une chaîne de plusieurs mots

>>> sentence = 'I love Python!'
>>> sorted(sentence)
[' ', ' ', '!' 'I', 'P', 'e', 'h', 'l', 'n', 'o', 'o', 't', 'v', 'y']

Comme on peut le voir dans l'exemple ci-dessus, lorsque le sorted() est appelée sur une chaîne de plusieurs mots, chaque caractère de la chaîne est traité comme un élément d'une liste, y compris les espaces vides. Python ordonne ces éléments en utilisant le standard Unicode. Ce que fait la norme Unicode, c'est attribuer un code unique à chaque caractère dans toutes les langues humaines. Cela permet à Python de comparer des caractères non numériques sur une base numérique car chaque caractère a sa valeur entière assignée.

Si, toutefois, vous souhaitez ordonner une chaîne en fonction des mots de la chaîne plutôt qu'en fonction de chaque caractère, le .split() la méthode de chaîne peut être utilisée.

Exemple 3 :Ordre des mots dans une phrase

>>> phrase = 'The cat in the hat'
>>> sorted(phrase.split())
['The', 'cat', 'hat', 'in', 'the']

Exemple 4 :Ordre des mots dans une liste

>>> words = ['Book', 'Bag', 'pencil', 'basket']
>>> sorted(words)
['Bag', 'Book', 'basket', 'pencil'] 

Cet exemple montre mieux comment la norme Unicode est utilisée. Python ordonne ces données en comparant initialement les premières lettres de chaque mot, et s'il les trouve identiques, il passera à la comparaison des deuxièmes lettres, puis de la troisième et ainsi de suite. Le tri a mis le mot "Livre" avant "panier" nous indiquant que les lettres majuscules et minuscules n'ont pas le même point de code Unicode. En général, les lettres majuscules auront des points de code inférieurs à leurs homologues minuscules et, par conséquent, les mots «Sac» et «Livre» sont placés au début de la liste. Étant donné que la première lettre, "B", est la même dans les deux mots, Python compare ensuite les secondes lettres.

Trier les listes et autres types de données complexes

Comme indiqué précédemment, lors du tri des données de toutes les valeurs numériques, la valeur par défaut consiste à trier les valeurs dans l'ordre croissant. Une nouvelle liste de valeurs ordonnées est créée et peut être stockée dans une nouvelle variable.

Exemple 1 :Trier une liste de valeurs numériques

>>> values = [3, 2, 6, 5]
>>> sorted_values = sorted(values)
>>> print(sorted_values)
[2, 3, 5, 6]

Exemple 2 :Trier un tuple de valeurs numériques

>>> numbers = (9, 2, 6, 3, 1)
>>> sorted_numbers = sorted(numbers)
>>> print(sorted_numbers)
[1, 2, 3, 6, 9]

Notez que, bien que nous ayons inséré un tuple, le sorted() La fonction renvoie toujours une liste. Si vous le souhaitez, vous pouvez convertir la liste triée en un tuple en utilisant le tuple() fonction et stockez-la dans une nouvelle variable :

>>> sorted_numbers_tup = tuple(sorted_numbers)
>>> print(sorted_numbers_tup)
(1, 2, 3, 6, 9)

Exemple 3 :Trier un dictionnaire

>>> d = {4: 'a', 3: 'b', 1: 'c'}
>>> sorted(d)
[1, 3, 4]

Notez que seules les clés du dictionnaire sont renvoyées dans une liste car, pour renvoyer à la fois la clé et la valeur du dictionnaire, l'argument clé dans le sorted() fonction devra être utilisée. Cela renverra alors une liste de tuples qui peuvent être convertis en dictionnaire en utilisant la fonction dict() . L'utilisation des clés sera abordée plus loin dans cet article.

Exemple 4 :Trier un ensemble

>>> s = {10, 2, 7, 3}
>>> sorted_s = sorted(s)
>>> print(sorted_s)
[2, 3, 7, 10]

Cependant, tenter de convertir cette liste ordonnée en un ensemble vous fera perdre l'ordre car un ensemble, par définition, n'est pas ordonné.

>>> set(sorted_s)
{10, 2, 3, 7}

Exemple 5 :Trier une liste imbriquée

>>> a = [[2, 4], [3, 2], [1, 5], [1, 1]]
>>> sorted(a)
[[1, 1], [1, 5], [2, 4], [3, 2]]

Ici, Python suit la même méthode que lors du tri d'une liste de mots. Le classement initial compare les premiers éléments des listes imbriquées. Les listes avec le même premier élément sont ensuite comparées en utilisant leurs seconds éléments et ainsi de suite. Les listes plus courtes sont également placées avant les listes plus longues étant donné que leurs éléments initiaux sont les mêmes.

>>> b = [[1, 2, 3], [2, 4], [1, 2]]
>>> sorted(b)
[[1, 2], [1, 2, 3], [2, 4]] 

Utiliser l'argument clé

L'argument clé dans le sorted() La fonction est un outil extrêmement utile car elle vous permet de trier les données selon vos spécifications exactes. La fonction que vous entrez indique à Python comment vous souhaitez que vos données soient ordonnées. Python applique cette fonction à chaque élément et ordonne les résultats. Pour cela, vous pouvez utiliser l'une des nombreuses fonctions intégrées de Python ou créer votre propre fonction en fonction de vos besoins.

Exemple 1 :Utilisation d'une fonction intégrée, sum()

>>> marks = [[1, 4, 5], [2, 1, 2], [2, 3, 5]]
>>> sorted(marks, key = sum)
[[2, 1, 2], [1, 4, 5], [2, 3, 5]]

Cet exemple classe les listes imbriquées en fonction de la somme de chaque liste, de la plus petite à la plus grande, au lieu de la valeur par défaut de trier par éléments.

Exemple 2 :Utilisation de votre propre fonction

>>> def temp(day):
        return day[1]

>>> weather = [['Monday', 25], ['Tuesday', 21], ['Wednesday', 30]]
>>> sorted(weather, key = temp)
[['Tuesday', 21], ['Monday', 25], ['Wednesday', 30]]

Cet exemple montre comment trier une liste en fonction du deuxième élément de chaque liste plutôt que du premier. Nous définissons d'abord une fonction qui renvoie le deuxième élément de chaque liste, puis utilisons cette fonction comme clé. Bien sûr, ce n'est peut-être pas la manière la plus Pythonique d'obtenir ce résultat. Le temp() la fonction peut être condensée en une seule ligne à l'aide de lambda.

Exemple 3 :Utilisation de lambda dans la clé

>>> sorted(weather, key = lambda day: day[1])
[['Tuesday', 21], ['Monday', 25], ['Wednesday', 30]]

Ces quelques exemples démontrent la puissance de l'argument clé.

Utiliser l'argument inverse

Le reverse argument est un concept assez simple à comprendre. Vous l'utilisez lorsque vous souhaitez que vos données soient organisées par ordre décroissant plutôt que par ordre croissant. Il ne prend qu'une valeur booléenne, avec True se référant à l'ordre décroissant et False se référant à l'ordre croissant. La valeur par défaut, bien sûr, est False .

Exemple :Trier par ordre décroissant

>>> y = [2, 5, 1, 7]
>>> sorted(y, reverse = True)
[7, 5, 2, 1]

La même méthode est utilisée, c'est-à-dire que les premiers éléments sont comparés, puis les seconds et ainsi de suite, pour trouver les plus grands éléments. L'argument inverse peut être combiné avec l'argument clé pour créer des tris plus complexes.

Essayer de comparer des éléments de différents types

Une limitation du sorted() fonction est qu'il est incapable de comparer différents types de données. Par exemple, essayer de trier une liste qui contient à la fois des types de chaîne et des types int entraîne un TypeError . C'est assez intuitif; comment pourrions-nous décider ce qui devrait venir en premier entre les éléments 'pommes' et 23.

Cependant, une comparaison qui peut être faite entre différents types consiste à comparer un type numérique (int ou float) avec un type booléen. En effet, les deux valeurs booléennes ont chacune une valeur numérique inhérente, True a la valeur 1 et False a la valeur 0. Cela signifie que nous pouvons comparer des listes qui ont des types numériques ainsi que des expressions booléennes car elles seront évaluées à True ou False .

Exemple :

>>> z = [1, 'A' == 'B', 4 > 3, 0]
>>> sorted(z)
[False, 0, 1, True]

Stabilité du tri

Une fonctionnalité utile du sorted() la fonction est quelque chose qui s'appelle la stabilité du tri . Cela signifie que si vous avez un itérable avec plusieurs éléments de la même valeur, ils conserveront leur ordre d'origine les uns par rapport aux autres. Ceci est très utile lorsque vous avez deux ou plusieurs itérations à travers, par exemple, une liste de tuples.

Exemple :

>>> books_read = [('Steve', 50), ('Dave', 20), ('Fiona', 37), ('Roger', 20)]
>>> sorted(books_read, key = lambda name: name[1])
[('Dave', 20), ('Roger', 20), ('Fiona', 37), ('Steve', 50)]

Dans cet exemple, une liste de tuples montre combien de livres chaque personne a lu en un an. Une simple fonction lambda a été utilisée pour comparer les tuples en utilisant la deuxième valeur de chaque tuple plutôt que la première. Vous pouvez voir que Dave et Roger ont lu le même nombre de livres, mais lorsque la liste a été commandée, ils ont conservé leur position l'un par rapport à l'autre.

Différence entre les fonctions list.sort() et sorted()

Enfin, il existe une fonction similaire pour le tri des listes appelée list.sort() . Cela fonctionne à peu près de la même manière que le sorted() fonction, cependant, il existe une différence essentielle entre les deux. Lorsque vous appelez la fonction list.sort() , il modifie la liste d'origine que vous triez et renvoie None .

>>> a = [5, 2, 6, 3]
>>> list.sort(a)
>>> a
[2, 3, 5, 6]

Par conséquent, lorsque vous décidez quelle fonction utiliser, il est important de déterminer si vous devez conserver les données d'origine non ordonnées. S'il y a une petite chance que vous en ayez à nouveau besoin, le sorted() fonction est une meilleure option. Non seulement il ne modifiera pas la liste d'origine, mais, comme mentionné précédemment, il acceptera n'importe quel itérable, ce qui en fera une fonction beaucoup plus puissante.

Par souci d'intérêt, voici un lien vers l'algorithme de tri utilisé par Python :Timsort


Pour booster vos compétences Python, téléchargez nos feuilles de triche Python fabriquées à la main et rejoignez notre académie par e-mail (gratuite) :