Trier une liste contenant des listes.

Bonjour à la communauté.
J’ai tenté d’utiliser l’IA de Dessin Tech pour trier une liste (qui en contient d’autres) alphabétiquement.
L’IA m’a proposé des codes qui comportent des fonctions qui « n’existeraient » pas dans mon AutoCAD® 2026 (pourquoi ?) comme « string< » ou « vl-string-replace-nth », ce n’est donc pas l’IA qui est en question mais ce serait mon AutoCAD®. Et « (vl-load-com) » est bien au début de mes codes.
J’ai essayé de résoudre le problème avec l’IA, qui m’a proposé d’analyser le résultat de « (type 'vl-sort) ».
Le résultat est « SYM », mais devrait être "EXSUBR" ou « FSUBR ».
Voici le code proposé par l’IA pour identifier le problème (qui ne fonctionne pas chez moi, l’erreur viendrait de lambda selon la réponse d’AutoCAD®) :

(defun C:TestVLSortSimple (/ maListeSimple trierFonctionSimple)
      (setq maListeSimple '(("b" 2) ("a" 1) ("c" 3)))
      (setq trierFonctionSimple (lambda (a b) (string< (car a) (car b))))
      (princ "\nTentative de tri d'une liste simple...")
      (setq maListeSimple (vl-sort maListeSimple trierFonctionSimple))
      (princ "\nListe simple triée : ")
      (princ maListeSimple)
      (princ)
    )

Je n’ai pas trouvé de fonction de comparaison alphabétique entre 2 valeurs dans mes références Lisp (PDF, codes…).
Voici ma liste :

  (setq maListe '(("Auvent 1" 14.7 0.0 "Rdc" "Ext" "N.Hab")
                  ("Auvent 2" 17.2 0.0 "Rdc" "Ext" "N.Hab")
                  ("Garage" 47.3 0.0 "Rdc" "Brut" "N.Hab")
                  ("S. manger" 38.2 0.0 "Rdc" "Jour" "Hab")
                  ("Salon" 31.9 0.0 "Rdc" "Jour" "Hab")
                  ("Cuisine" 11.6 0.0 "Rdc" "Hum" "Hab")
                  ("Chambre 1" 18.2 0.0 "Rdc" "Nuit" "Hab")
                  ("Chambre 2" 19.1 0.0 "Rdc" "Nuit" "Hab")
                  ("Chambre 3" 22.1 0.0 "Rdc" "Nuit" "Hab")
                  ("Chambre 4" 21.1 0.0 "Rdc" "Nuit" "Hab")
                  ("Chambre 5" 18.7 0.0 "Rdc" "Nuit" "Hab")
                  ("W.C. 1" 2.1 0.0 "Rdc" "Hum" "Hab")
                  ("W.C. 2" 5.7 0.0 "Rdc" "Hum" "Hab")
                  ("S. eau 1" 16.2 0.0 "Rdc" "Hum" "Hab")
                  ("S. eau 2" 9.0 0.0 "Rdc" "Hum" "Hab")
                  ("Entrée" 9.6 0.0 "Rdc" "Jour" "Hab")
                  ("Couloir" 24.0 0.0 "Rdc" "Jour" "Hab")))

Si quelqu’un a une idée, une réponse, une solution, je suis preneur.
Bien à toi la communauté.
Denis…

Plutôt que string< il doit s’agir de strcase< je suppose ? (après vérification, Gemini 2.5 Flash s’est fourvoyé, il n’existe pas de fonction strcase< en Autolisp…)

Merci beaucoup Patrick.
Je viens de redemander à l’IA, et cette fois-ci, sa réponse est :

(setq maListeTriee
  (vl-sort maListe
    '(lambda (a b)
       (< (car a) (car b))
     )
  )
)

Ca fonctionne parfaitement ! !
(sauf avec des incrémentations > 9, exemple : « Chambre 2 » sera après « Chambre 12 », ce que je comprends très bien, le tri se fait selon les codes ASCII).
Je n’ai pas compris pourquoi la réponse était différente avant, et beaucoup plus complexe…
Mais je pense que je manque d’entrainement avec l’IA…
Quant à « strcase », je pensais que ça ne changeait que la casse d’une chaine (vu dans « Introduction à AutoLISP ® » de Gilles CHANTEAU). Je n’avais pas pensé à l’utiliser pour une comparaison.
J’ai continué avec l’IA et j’ai obtenu un code avec un tri « naturel » qui fonctionne parfaitement ! !
Encore un super grand merci !
Denis.

Pour ça, il suffit que tu demandes à l’IA dans ton prompt de prendre en compte cette problématique en lui demandant un « tri naturel ». (mais je crois que finalement tu as réussi à faire ça. :smiley:)

Voici une définition précise et structurée du tri naturel.

Définition

Le tri naturel (ou natural sort order) est une méthode de classement de chaînes de caractères qui prend en compte la sémantique numérique des chiffres présents dans le texte.

Contrairement au tri informatique standard (lexicographique) qui traite les chiffres comme de simples symboles sans valeur quantitative, le tri naturel découpe la chaîne en segments de texte et de nombres. Il compare ensuite les segments textuels alphabétiquement et les segments numériques selon leur valeur arithmétique réelle.


Les 3 Piliers du Tri Naturel

Pour bien comprendre cette définition, il faut retenir ces trois points clés :

  1. L’Intuition Humaine : Il est appelé « naturel » car c’est ainsi qu’un être humain classerait instinctivement une liste de volumes d’une encyclopédie ou de chapitres (Chapitre 1, Chapitre 2, …, Chapitre 10).
  2. La Segmentation : L’algorithme ne lit pas « fichier123 » comme une suite de lettres f-i-c-h-i-e-r-1-2-3. Il le lit comme un tuple : ("fichier", 123).
  3. L’Indépendance au « Padding » : Il n’a pas besoin que les nombres soient complétés par des zéros (ex: 001, 002) pour fonctionner correctement. Il sait que 2 est plus petit que 10, même s’ils n’ont pas la même longueur.

Exemple de logique algorithmique

Voici comment le tri naturel analyse et compare deux chaînes :

  • Chaîne A : « Photo 23 vacances »
  • Chaîne B : « Photo 5 vacances »

L’analyse du tri naturel :

  1. Il compare le texte "Photo " avec "Photo " $\rightarrow$ Identique.
  2. Il détecte un nombre. Il compare la valeur 23 avec la valeur 5.
  3. Puisque $5 < 23$, il détermine que Chaîne B doit être placée avant Chaîne A.

En résumé : C’est le tri qui respecte l’alphabet pour les lettres, mais respecte les mathématiques pour les nombres.

1 « J'aime »

Oui, c’est ce que j’ai fais, et l’IA est très réactive, et très efficace ! !
Elle m’a pondu le code en quelques minutes (compris les nombreuses précisions que je lui ai donnée après les avoir testés).

1 « J'aime »