Différence entre sort() et sorted() en Python
Le tri est un sujet très important dans le monde de l’informatique. Il existe de nombreux algorithmes disponibles pour trier des tableaux de données, tels que le tri par fusion, le tri rapide, le tri à bulles, le tri par sélection, le tri par insertion, etc. Tous ces algorithmes ont des complexités temporelles et spatiales différentes, mais la fusion et le rapide sont généralement considérés comme les meilleurs. Le tri étant une opération très courante, les langages de programmation contiennent des fonctions intégrées pour trier les données. Et Python est l’un d’entre eux.
Mais, il existe deux fonctions de tri en Python, à savoir sort
et sorted
. Dans cet article, nous allons découvrir la différence entre ces deux fonctions de tri.
La fonction sort()
en Python
La fonction sort
de Python trie la liste en place en échangeant les valeurs à ses index. Lorsque nous appelons la fonction sort
sur une liste, une nouvelle liste n’est pas renvoyée ; plutôt, la même liste est triée. La fonction sort()
peut être utilisée pour trier des listes.
Référez-vous au code suivant pour un exemple.
myList = [1, 5, 2, 10, 33, 3, 9]
print(myList)
myList.sort()
print(myList)
Production:
[1, 5, 2, 10, 33, 3, 9]
[1, 2, 3, 5, 9, 10, 33]
Comme nous pouvons le voir, la même liste a été triée lorsque nous avons appelé la fonction sort
dessus.
Si nous souhaitons trier la liste dans l’ordre inverse, nous pouvons également le faire en définissant l’argument reverse
sur True
.
Reportez-vous au code suivant pour la même chose.
myList = [1, 5, 2, 10, 33, 3, 9]
print(myList)
myList.sort(reverse=True)
print(myList)
Production:
[1, 5, 2, 10, 33, 3, 9]
[33, 10, 9, 5, 3, 2, 1]
La fonction sort
a encore un autre paramètre, à savoir key
, qui peut être utilisé pour définir la valeur à considérer pour le tri. Par exemple, si nous avons une liste de paires et que nous souhaitons trier les paires en fonction de la deuxième valeur, nous pouvons le faire en utilisant le paramètre key
.
Référez-vous au code suivant pour un exemple.
def secondElement(element):
return element[1]
data = [(1, 2), (3, 4), (5, 3), (6, 6), (3, 0), (10, 1)]
print("Before sorting:", data)
data.sort(key=secondElement)
print("After sorting:", data)
Production:
Before sorting: [(1, 2), (3, 4), (5, 3), (6, 6), (3, 0), (10, 1)]
After sorting: [(3, 0), (10, 1), (1, 2), (5, 3), (3, 4), (6, 6)]
Comme nous pouvons le voir, la liste est triée en fonction du deuxième nombre à l’intérieur des paires.
Nous pouvons également trier une liste de dictionnaires en utilisant la même approche. Reportez-vous au code suivant pour la même chose.
def byName(entry):
return entry["name"]
def byAge(entry):
return entry["age"]
def byRank(entry):
return entry["rank"]
data = [
{
"name": "Vaibhav",
"age": 18,
"rank": 1,
},
{
"name": "Steve",
"age": 24,
"rank": 5,
},
{
"name": "Olive",
"age": 12,
"rank": 2,
},
{
"name": "Allison",
"age": 17,
"rank": 4,
},
]
print("Original Data")
print(data)
print("Sorted by Name")
data.sort(key=byName)
print(data)
print("Sorted by Age")
data.sort(key=byAge)
print(data)
print("Sorted by Rank")
data.sort(key=byRank)
print(data)
Production:
Original Data
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}]
Sorted by Name
[{'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}]
Sorted by Age
[{'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}]
Sorted by Rank
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Steve', 'age': 24, 'rank': 5}]
Comme nous pouvons le voir, les entrées dans la liste des dictionnaires sont triées en fonction de la clé que nous avons définie.
La fonction sorted()
en Python
Comme la fonction sort
, sorted
est également utilisé pour trier des listes. Mais, la fonction sorted
renvoie une nouvelle liste au lieu de trier la même liste en place. C’est la principale différence entre les deux fonctions. Comprenons cela avec un exemple.
myList = [1, 5, 2, 10, 33, 3, 9]
print("Before called sorted():", myList)
newList = sorted(myList)
print("After called sorted():", myList)
print("New list:", newList)
Production:
Before called sorted(): [1, 5, 2, 10, 33, 3, 9]
After called sorted(): [1, 5, 2, 10, 33, 3, 9]
New list: [1, 2, 3, 5, 9, 10, 33]
Comme nous pouvons le voir, la liste que nous avons passée à la fonction sorted
reste la même, et une nouvelle liste a été renvoyée, qui est stockée dans la variable newList
. Les deux paramètres, à savoir reverse
et key
, sont également disponibles dans cette fonction. En utilisant les deux, nous pouvons obtenir une liste triée dans l’ordre inverse et trier la liste en fonction d’une clé personnalisée. Les exemples suivants illustrent la même chose.
Exemple pour le paramètre reverse
.
myList = [1, 5, 2, 10, 33, 3, 9]
print("Before called sorted():", myList)
newList = sorted(myList, reverse=True)
print("After called sorted():", myList)
print("New list:", newList)
Production:
Before called sorted(): [1, 5, 2, 10, 33, 3, 9]
After called sorted(): [1, 5, 2, 10, 33, 3, 9]
New list: [33, 10, 9, 5, 3, 2, 1]
Et, un exemple pour le paramètre key
.
def byName(entry):
return entry["name"]
def byAge(entry):
return entry["age"]
def byRank(entry):
return entry["rank"]
data = [
{
"name": "Vaibhav",
"age": 18,
"rank": 1,
},
{
"name": "Steve",
"age": 24,
"rank": 5,
},
{
"name": "Olive",
"age": 12,
"rank": 2,
},
{
"name": "Allison",
"age": 17,
"rank": 4,
},
]
print("Original Data")
print(data)
print("Sorted by Name")
nameSorted = sorted(data, key=byName)
print(nameSorted)
print("Sorted by Age")
ageSorted = sorted(data, key=byAge)
print(ageSorted)
print("Sorted by Rank")
rankSorted = sorted(data, key=byRank)
print(rankSorted)
print("Data after all operations")
print(data)
Production:
Original Data
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}]
Sorted by Name
[{'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}]
Sorted by Age
[{'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}]
Sorted by Rank
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Steve', 'age': 24, 'rank': 5}]
Data after all operations
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}]