Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

3 réponses
Avatar
Denis Bitouzé
Bonjour,

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

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

je souhaiterais obtenir apr=E8s tri :

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

Je sais trier selon un =E9l=E9ment ou un autre :

>>> liste=3D[['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 =AB =E0 la fois =BB.

Merci d'avance pour toute piste...
--=20
Denis

3 réponses

Avatar
Alain BARTHE
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...


Avatar
Denis Bitouzé
Le samedi 02/05/09 à 23h00,
Alain BARTHE a écrit :

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
Avatar
Boris Borcic
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.