Tri de listes imbriquées en cas d'ex aequo

Le
Denis Bitouzé
Bonjour,

je souhaiterais, dans une liste de listes, trier selon un premier
élément puis, en cas d'ex aequo, selon un second. Ainsi, si :

liste=[['b',2],['a',3],['b',1]]

je souhaiterais obtenir après tri :

[['a', 3], ['b', 1], ['b', 2]]

Je sais trier selon un élément ou un autre :

>>> liste=[['b',2],['a',3],['b',1]]
>>> liste.sort(lambda x, y: cmp(x[0], y[0]))
>>> print liste
[['a', 3], ['b', 2], ['b', 1]]
>>> liste.sort(lambda x, y: cmp(x[1], y[1]))
>>> print liste
[['b', 1], ['b', 2], ['a', 3]]

mais pas les deux « à la fois ».

Merci d'avance pour toute piste
--
Denis
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Alain BARTHE
Le #19249861
Essayes ça :

def compare (g,d):
"""En cas d'egalite du premier element de deux couples g et d,
comparer le second element
sinon retourner la comparaison des premiers elements
"""
if g[0] == d[0]:
return cmp (g[1], d[1])
else:
return cmp (g[0], d[0])

liste = ...

liste.sort (compare)

print liste

El fait, je me demande même si par défaut, l'appel liste.sort()
tout seul n'est pas suffisant dans ton cas


Bonjour,

je souhaiterais, dans une liste de listes, trier selon un premier
élément puis, en cas d'ex aequo, selon un second. Ainsi, si :

liste=[['b',2],['a',3],['b',1]]

je souhaiterais obtenir après tri :

[['a', 3], ['b', 1], ['b', 2]]

Je sais trier selon un élément ou un autre :

liste=[['b',2],['a',3],['b',1]]
liste.sort(lambda x, y: cmp(x[0], y[0]))
print liste






[['a', 3], ['b', 2], ['b', 1]]
liste.sort(lambda x, y: cmp(x[1], y[1]))
print liste






[['b', 1], ['b', 2], ['a', 3]]

mais pas les deux « à la fois ».

Merci d'avance pour toute piste...


Denis Bitouzé
Le #19255041
Le samedi 02/05/09 à 23h00,
Alain BARTHE
El fait, je me demande même si par défaut, l'appel liste.sort()
tout seul n'est pas suffisant dans ton cas



Je ne sais plus pourquoi j'avais eu besoin de cmp (ça date d'il y a au
moins un an) mais il est vrai que, à condition construire les
sous-listes dans l'ordre de priorité des éléments à classer, ça
marche.

Comme je sens bien que la phrase précédente est tout sauf claire, je
précise : ce que j'entends par là est que si on dispose d'une liste de
personnes caractérisées *entre autres* par leurs dates de naissance,
noms et prénoms et qu'on souhaite classer selon les noms puis prénoms
puis date de naissances les dites personnes, il faudra construire les
listes de caractéristiques des personnes en faisant figurer en 1er les
noms, en 2e les prénoms et en 3e les dates de naissances...

Merci !
--
Denis
Boris Borcic
Le #19269511
Denis Bitouzé wrote:
Merci d'avance pour toute piste...



Une piste est que le tri python est stable, cad que les ex aequo vont con server
l'ordre qu'ils ont dans l'input. Donc une voie est de trier d'abord selon le
critère secondaire, puis selon le critère primaire.
Publicité
Poster une réponse
Anonyme