Bonjour,
Pour les doublons, on peut aussi supprimer de la liste les éléments qui se répètent, ce qui permet de ne pas avoir 2 listes en mémoire. L'instruction L.pop(i) supprime l'élément d'indice i. On parcourt alors la liste triée avec une boucle while. Par exemple:
1 2 3 4 5 6 7 8 9 10 11 12
|
L = [1,2,2,3,4,5,5,5,5,6,6]
i = 1
while i<len(L):
if L[i] == L[i-1]:
L.pop(i)
else:
i += 1
print L
[1, 2, 3, 4, 5, 6] |
Pour le tri sous Python, les fonctions sort et sorted sont très puissantes et très adaptables.
L.sort() trie sur place et sorted(L) donne une nouvelle liste triée.
il y a 2 arguments optionnels à ces fonctions sous Python 2.6: cmp et key. Ces arguments sont des fonctions qui permettent de modifier les valeurs que la fonction de tri utilise dans ses comparaisons. En créant ses propres fonctions (c'est facile), on peut trier n'importe quoi, y compris, par exemple, une liste d'instance de classe par rapport à l'un des attributs, ou une liste de liste de chaines par rapport à une sous-chaine du 3ème élément. On peut aussi faire des tris selon l'alphabet français du dictionnaire ou selon l'ordre qu'on veut pour afficher des contenus de répertoires de disque (majuscule d'abord, puis tenir compte des caractères accentués, etc...).
Prenons un petit exemple:
On veut trier la liste suivante selon le 2ème élément de chaque sous-liste:
L = [[9,4,7],[6,1,4],[2,7,4],[0,9,8],[4,3,7],[2,1,0],[3,7,9]]
On définit une nouvelle fonction de comparaison: les arguments v1 et v2 étant les éléments de la liste L, seront en fait ses sous-listes. Il est alors facile d'identifier le 2ème élément de chaque sous-liste (indice=1).
1 2 3 4 5 6 7
| def comp(v1, v2):
if v1[1]<v2[1]:
return -1
elif v1[1]>v2[1]:
return 1
else:
return 0 |
Et on trie comme d'habitude:
Cela donne:
[[6, 1, 4], [2, 1, 0], [4, 3, 7], [9, 4, 7], [2, 7, 4], [3, 7, 9], [0, 9, 8]]
Ce qui est un résultat correct!
A noter que les tris sont stables, c'est à dire ne modifient pas l'ordre des éléments dont les valeurs de tri sont égales. Ce qui permet d'appliquer successivement plusieurs tris.
Je crois que Python 3.0 n'a plus que l'argument key, mais on peut faire la même chose avec:
1 2 3 4 5
|
def cle(v):
return v[1]
L.sort(key=cle) |
ce qui donne le même résultat trié.
Tyrtamos
Partager