Tri Python selon plusieurs critères
	
	
		Je cherche à trier la liste ci-dessus selon 2 critères:
- critère principal: le nom (3eme caractère)
- critère secondaire: l'année
J'ai essayé la fonction suivante, évidemment sans succès:
	Code:
	
| 12
 3
 4
 5
 6
 7
 8
 
 | def compare(v1, v2):
    if v1[2]<v2[2]:
        return -1
    elif v1[-8:-4]>v2[-8:-4]:
        return 1
    else:
        return 0
print(liste.sort(compare())) | 
 Il y a sûrement mieux
Merci d'avance
J
	 
	
	
	
		Tri Python selon plusieurs critères
	
	
		Merci à tous les deux de votre aide et de ces rappels bien utiles après avoir laissé dormir ce script pendant presque 5 ans
Les 2 formules marchent bien sûr mais j'ai privilégié la seconde, plus légère, l'un des objectifs de la réécriture étant de faire maigrir le code d'au moins 30%.
Je m'interroge cependant sur la perfection du tri python: ce n'est pas la première fois que je le vois mais vous pouvez aussi constater que l'ordre alphabétique n'est pas intégralement respecté dans ce tableau:
http://www.liversay.free.fr/44/html/mariages.php
Est-ce mon code (tri sur un seul caractère?)? Est-ce la disposition en tableau?
Qu'en pensez-vous?
J
	 
	
	
	
		Tri Python selon plusieurs critères
	
	
		Après plusieurs essais suite à erreurs de syntaxe (notamment upper rejeté), j'ai retenu la formule suivante:
	Code:
	
| 12
 3
 4
 5
 
 | #liste44ab=sorted(liste44a,key=lambda v:(v[2],v[-8:-4]))                    #liste44 triée sur le 3eme caractère, puis sur l'année
#liste44d=sorted(liste44,key=lambda v:(v[-8:-4],v[2]))                      # liste triée sur les dates, puis sur le nom, avec chemins complets
liste44ab=sorted(liste44a, key=lambda v: [v.split('_')[2], v.split('_')[-8:-4]])
liste44d=sorted(liste44a, key=lambda v: [v.split('_')[-8:-4], v.split('_')[2]])
#liste2 = sorted(liste, key=lambda v: [v.split('_')[1].upper(), int(v.split('_')[3].split('.')[0])]) | 
 Désolé, cela ne marche pas. Aucun tri.
	 
	
	
	
		Tri Python selon plusieurs critères
	
	
		
	Citation:
	
		
		
			Sans doute que vos noms ne contiennent pas un nombre constant de '_'.
Essayez avec sorted(liste, key=lambda s: (s[2:-9].upper(), s[-8:-4])).
			
		
	
 C'est exact. c'est sans doute là la cause profonde de mon problème. Il y a en effet quelques exceptions que je ne peux lever, liées à la nature du nom.
Cette formule permet de lever toutes les imprécisions du tri qui est maintenant parfait:
http://www.liversay.free.fr/44/html/baptemes.php ;)
Merci.
Merci à tous les deux pour votre aide.
J