Fraid Posté(e) le 20 avril 2012 Posté(e) le 20 avril 2012 Bonjour, J'ai un petit soucis avec la lecture d'une liste qui se présente ainsi (setq Liste '(("fdffg" "FDFFG" "1234" "4569" "22" )("fdifg" "FDIFG" "1224" "4569" "22" )("mdffg" "MDFFG" "1434" "4569" "22" )("adffg" "ADFFG" "1234" "4169" "22" )....))une entrée (setq Rech (strcase (getstring T "\nTapper le string : ") nil)) exemple: mdffg une recherche (mapcar '(lambda (x) (if (= (nth 1 x) Rech) (setq lst (cons (list (nth 1 x) (nth 2 x)) lst)))) liste ) me retourne ("MDFFG" "1434") la, tout est OK Par contre si je fait (mapcar '(lambda (x) (if (= (nth 2 x) Rech) (setq lst (cons (list (nth 2 x) (nth 1 x)) lst)))) liste ) il me retourne NIL alors qu'il devrait me retourner une liste de listes... Bah pourquoi? Merci pour vos conseils lumineux https://github.com/Fraiddd
VDH-Bruno Posté(e) le 20 avril 2012 Posté(e) le 20 avril 2012 Bonjour Fraid, Je ne suis pas sûr de bien saisir l’énoncer du problème.. De plus les résultats que tu donnes ne correspondent pas tout à fait la réalité..Tu peux développer un peu plus ce que tu souhaiterais obtenir..A+ Apprendre => Prendre => Rendre
Patrick_35 Posté(e) le 21 avril 2012 Posté(e) le 21 avril 2012 Salut Je suis comme VDH-Bruno, par certain de tout comprendre.Je vais quand même te donner une astuce pour éviter d'utiliser un mapcar, c'est d'utiliser assoc Par exemple(assoc "mdffg" Liste)ce qui devrait retourner logiquement("mdffg" "MDFFG" "1434" "4569" "22" ) Ensuite, avoir dans la liste retournée, les deux premiers éléments identiques, je ne vois pas trop l'intérêt, au contraire. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Fraid Posté(e) le 21 avril 2012 Auteur Posté(e) le 21 avril 2012 C'est vrais que je suis aller un peu vite en fait je cherche a faire une fonction (nomfonction a b liste) a et b la place occupée dans la liste et qu'elle me retourne la valeur b par rapport à a (les valeurs sont des strings meme si ce sont des nombres, car parfois une lettre vient s'inserer et cela me simplifie l'exploitation du retour. si il y a plusieurs solutions j'utilise la fonction dos_listbox pour en choisir une Ensuite, avoir dans la liste retournée, les deux premiers éléments identiques, je ne vois pas trop l'intérêt, au contraire c'est une liste que je crée avec un .csv que l'on ma fournis, il y a plus de 30000 lignes a explorer, j'ai donc besoin d'un outil configurable à souhait pour l'exploiter dans tout les sens. Le contenu n'est pas important pour le sujet du post et ne ferais que embrouiller les choses. merci https://github.com/Fraiddd
Fraid Posté(e) le 21 avril 2012 Auteur Posté(e) le 21 avril 2012 je suis en train de tester ASSOC... j'ai un peu peur des récursions non maîtrisées.. https://github.com/Fraiddd
Fraid Posté(e) le 21 avril 2012 Auteur Posté(e) le 21 avril 2012 je pense vraiment que c'est avec mapcar ou apply que je peux explorer correctement ma liste de listes..jtourne en rond... je vais aller boire un ptit rhum a la rhumerie du coin, sa va ptetre m'inspirer... https://github.com/Fraiddd
bonuscad Posté(e) le 21 avril 2012 Posté(e) le 21 avril 2012 Salut Fraid, Pas bien suivi non plus ton ennoncé...a et b la place occupée dans la listeCa veux dire la position occupé (1er élément, 2ème etc..) J'ai l'impression que tu te fourvois avec (nth), il y a un décalage...(nth 0 liste) -> renvoie le 1er élément.(nth 1 liste) -> renvoie le 2ème élément.(nth 2 liste) -> renvoie le 3ème élément. (et pas le second ;) ) Il faudrait vraiment que tu donnes la liste en retour que tu souhaite obtenir quand tu soumet la liste de départ à ta fonction AVEC les arguments qui vont bien. Car là tu parles d'une clé string au départ du post et puis de position dans la liste par la suite sans plus parler de clé...(nomfonction a b liste) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Patrick_35 Posté(e) le 23 avril 2012 Posté(e) le 23 avril 2012 je suis en train de tester ASSOC... j'ai un peu peur des récursions non maîtrisées..Tu n'as aucune récursion.Cela permet d'appeler directement la liste souhaitée. c'est dans la même logique que les codes dxf je pense vraiment que c'est avec mapcar ou apply que je peux explorer correctement ma liste de listes..jtourne en rond... Cela dépend du besoin. Si tu as plusieurs fois le même identifiant, oui, voir avec vl-remove-if ou vl-remove-if-not, mais s'il est unique, c'est vraiment avec assoc le plus simple.Miantenant, c'est comme tu veux @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Fraid Posté(e) le 23 avril 2012 Auteur Posté(e) le 23 avril 2012 Merci patrick c'est dans la même logique que les codes dxf ...je n'arrive pas à utiliser ma liste comme des paires pointées... Si tu as plusieurs fois le même identifiant c'est tout a fait le cas, Mais je devais subir la fatigue de fin de semaine car (defun c:test ( / lste ) (setq Lste '( ("fdffg" "FDFFG" "1234" "4569" "22" ) ("fdifg" "FDIFG" "1224" "4569" "22" ) ("mdffg" "MDFFG" "1434" "4569" "22" ) ("adffg" "ADFFG" "1234" "4169" "22" ) )) ( CheckList (strcase (getstring T "\nTapper le string : ") nil) 3 2 Lste) ) (defun CheckList ( Rech PosA PosB Liste / lst) (setq PosA (- PosA 1) PosB (- PosB 1)) (mapcar '(lambda (x) (if (= (nth PosA x) Rech) (setq lst (cons (list (nth PosA x) (nth PosB x)) lst)))) liste ) ) fonctionne ! il me reste plus qu'a nettoyer ma liste retournée mais je veux bien un exemple avec ASSOC, car je n'ai pas reussi grand chose avec https://github.com/Fraiddd
Patrick_35 Posté(e) le 23 avril 2012 Posté(e) le 23 avril 2012 Quelque chose danc ce style ? (defun c:test ( / lste result) (setq Lste '( ("fdffg" "FDFFG" "1234" "4569" "22" ) ("fdifg" "FDIFG" "1224" "4569" "22" ) ("mdffg" "MDFFG" "1434" "4569" "22" ) ("adffg" "ADFFG" "1234" "4169" "22" ) ) ) (setq CheckList (strcase (getstring T "\nTapper le string : ") T)) (mapcar '(lambda(x)(list (nth 2 x) (nth 1 x))) (vl-remove-if-not '(lambda(x)(eq (caddr x) CheckList)) Lste)) ) Un exemple avec assoc, mais qui utilise le 1er élément de la liste (par exemple mdffg) (defun c:test ( / lste result) (setq Lste '( ("fdffg" "FDFFG" "1234" "4569" "22" ) ("fdifg" "FDIFG" "1224" "4569" "22" ) ("mdffg" "MDFFG" "1434" "4569" "22" ) ("adffg" "ADFFG" "1234" "4169" "22" ) ) ) (setq CheckList (strcase (getstring T "\nTapper le string : ") T)) (if (setq result (assoc CheckList Lste)) (list (nth 2 result) (nth 1 result)) ) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 23 avril 2012 Posté(e) le 23 avril 2012 Ma version: (defun c:test ( / lste) (setq Lste '( ("fdffg" "FDFFG" "1234" "4569" "22" ) ("fdifg" "FDIFG" "1224" "4569" "22" ) ("mdffg" "MDFFG" "1434" "4569" "22" ) ("adffg" "ADFFG" "1234" "4169" "22" ) ) ) (CheckList (strcase (getstring T "\nTapez la chaine à trouver: ") nil) (getint "\nA la position: ") Lste) ) (defun checklist (str pso lst / nw_lst) (mapcar '(lambda (x) (if (setq pos (vl-position str x)) (if (eq (1+ pos) pso) (setq nw_lst (cons x nw_lst)) ) ) ) lst ) nw_lst ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
VDH-Bruno Posté(e) le 23 avril 2012 Posté(e) le 23 avril 2012 Salut,il me reste plus qu'a nettoyer ma liste retournéePour nettoyer (cad supprimé les nil de la liste retourné) l’astuce consiste à appliquer un append sur ta valeur en retour du type (apply ‘append …L’emploie d’une variable comme tu le fais pour essayer de filtrer les nil est plus commun à une construction de code de type foreach.. Pour voir d'autre façon de faire, tu peux suivre ce lien massoc, tu trouveras différentes solutions (foreach, while, vl-remove-if-not, append + mapcar, repeat, récursive…) pour traiter ton cas, qu'il suffira d’adapter légérement le traitement. Sinon pour faire comme ceux que je considère ici comme mes mentors, voici ma version: (defun c:test (/ CheckList) (defun CheckList (key alst) (if (setq alst (member (assoc key alst) alst)) (cons (list (nth 2 (car alst)) (nth 1 (car alst))) (CheckList key (cdr alst)) ) ) ) (CheckList (strcase (getstring T "\nTapper le string : ") T) '(("fdffg" "FDFFG" "1234" "4569" "22") ("fdifg" "FDIFG" "1224" "4569" "22") ("mdffg" "MDFFG" "1434" "4569" "22") ("adffg" "ADFFG" "1234" "4169" "22") ) ) ) A+ Apprendre => Prendre => Rendre
Fraid Posté(e) le 23 avril 2012 Auteur Posté(e) le 23 avril 2012 Merci a tous J'ai encore appris beaucoup de choses grâce à vous a pluche https://github.com/Fraiddd
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