Fraid Posté(e) le 2 octobre 2012 Posté(e) le 2 octobre 2012 Bonjour, Une liste sous cette forme (setq &liste '( ("TitreItem1" "TitreItem2" "TitreItem3" "TitreItemx" );doit rester en premier ("Item1" "Item2" "Item3" "Itemx") ("Pierre" "Remy" "Dudul" "Nidre") ("Albert" "Trent" "Bob" "Jane") ;... ) ) j'aimerai pouvoir la trier avec une fonction du genre (TriListList &liste NumeroItem <) Donc trier selon les Items qui prennes la X em place dans la liste, sachant que celle qui contient les titres doit rester en premier.Exemple(TriListList &liste 3 <) me renverrai '( ("TitreItem1" "TitreItem2" "TitreItem3" "TitreItemx") ("Albert" "Trent" "Bob" "Jane") ("Pierre" "Remy" "Dudul" "Nidre") ("Item1" "Item2" "Item3" "Itemx") ) Pas sur d'avoir été très clair, mais je m'en sort pas avec VL-SORT tous seulExiste t'il une fonction toute faite (hors le maintien de la premiere liste, ça je peux m'en sortir) ? https://github.com/Fraiddd
(gile) Posté(e) le 2 octobre 2012 Posté(e) le 2 octobre 2012 Salut, En LISP, comme dans la plupart des langages de programmation les listes sont indexées sur une base 0 (le premier item a l'indice 0). (defun trilistlist (l i) (cons (car l) (vl-sort (cdr l) '(lambda (l1 l2) (< (nth i l1) (nth i l2)) ) ) ) )(trilistlist &liste 2) retourne :(("TitreItem1" "TitreItem2" "TitreItem3" "TitreItemx") ("Albert" "Trent" "Bob" "Jane") ("Pierre" "Remy" "Dudul" "Nidre") ("Item1" "Item2" "Item3" "Itemx") ) Si tu veux vraiment un indice basé sur 1, remplace (nth i l*) par (nth (- i 1) l*) ou place un (setq i (1- i)) en début de routine. Si tu veux pouvoir spécifier la fonction de tri, comme dans vl-sort :(defun trilistlist (l i f) (cons (car l) (vl-sort (cdr l) '(lambda (l1 l2) (apply f (list (nth i l1) (nth i l2))) ) ) ) )La fonction de tri passée en argument doit être "quotée" :(trilistlist &liste 2 '>) ; tri décroissantretourne :(("TitreItem1" "TitreItem2" "TitreItem3" "TitreItemx") ("Item1" "Item2" "Item3" "Itemx") ("Pierre" "Remy" "Dudul" "Nidre") ("Albert" "Trent" "Bob" "Jane") ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
rebcao Posté(e) le 2 octobre 2012 Posté(e) le 2 octobre 2012 Bonsoir, Il existe aussi la fonction ( ACAD_STRLSORT TA-LISTE ) Christian Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)
Fraid Posté(e) le 3 octobre 2012 Auteur Posté(e) le 3 octobre 2012 Merci a tout les deux, ACAD_STRLSORT , je ne connaissait pas, je ne regarde pas assez de ce coté, je vais plus facilement vers la lettre V quand je cherche des fonctions... et je vois bien que j'ai encore beaucoup de progrès à faire avant de réaliser tout seul une fonction comme tu me présente Gile. je n'arrive pas a en déduire l'algorithme '(lambda (l1 l2) comment les arguments sont ils renseignés??? https://github.com/Fraiddd
(gile) Posté(e) le 3 octobre 2012 Posté(e) le 3 octobre 2012 Salut, acad_strlsort est une fonction de tri utilisable uniquement avec listes de chaînes, elle ne sera donc d'aucune utilité dans le cas présent où il est question de trier une liste de listes de chaînes qui plus est avec avec un critère particulier. vl-sort est une fonction tri de liste plus générique qui utilise la fonction de comparaison qui lui est passée en argument. Il faut, bien sûr que les éléments de la liste soit comparables à l'aide de la fonction utilisée. La fonction de comparaison peut être de tout type de fonction : prédéfinie (comme ) définie par l'utilisateur (avec (defun ...)) ou une fonction anonyme ((lambda ...)). Hormis les fonctions d'inégalité prédéfinies ( =) la fonction de comparaison doit accepter deux arguments et retourner T si le premier argument doit être placé devant le second dans la liste triée). vl-sort utilise ensuite la fonction de comparaison dans un algorithme de tri en comparant les éléments de la liste par deux. Dans le cas présent la fonction anonyme (expression lambda) compare deux éléments de la liste, soit deux listes de chaînes, et évalue si le nième élément de la première sous liste est inférieur au nième élément de la seconde sous liste : (si c'est le cas, l'expression retourne T et le premier argument sera placé avant le second dans la liste triée, si ce n'est pas le cas (l'expression retourne nil) le second argument est placé devant le premier. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant