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:
1 2 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:
1 2 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