Aller au contenu

Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

Salut Fraid,

 

Pas bien suivi non plus ton ennoncé...

a et b la place occupée dans la liste

Ca 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

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

Salut,

il me reste plus qu'a nettoyer ma liste retournée

Pour 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

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité