Transformer une liste simple en liste de paires pointées.

Transformer une liste simple en liste de paires pointées.

DenisHen
Advocate Advocate
815 Visites
11 Réponses
Message 1 sur 12

Transformer une liste simple en liste de paires pointées.

DenisHen
Advocate
Advocate

Bonjour à tous.

Je cherche à transformer une liste simple en liste de paires pointées, de ça :

 

("lundi" "mardi" "mercredi"...)

 

J'aimerais en faire ça :

 

((1 . "lundi") (2 . "mardi") (3 . "mercredi")...)

 

Je pense que ça doit se faire avec un mapcar, mais cette fonction reste pour moi un mystère.

Bon week-end à tous.

Denis...

0 J'aime
Solutions acceptées (1)
816 Visites
11 Réponses
Replies (11)
Message 2 sur 12

CADaSchtroumpf
Advisor
Advisor

Salut,

et oui (mapcar est la solution, pourtant les exemples de l'aide sont assez explicite...

(mapcar '(lambda ( x y ) (cons x y)) '(1 2 3 4 5 6 7) '("lundi" "mardi" "marcredi" "jeudi" "vendredi" "samedi" "dimanche"))
0 J'aime
Message 3 sur 12

DenisHen
Advocate
Advocate

Salut CADaSchtroumpf, et merci pour ton aide.

L'aide est peut-être "explicite" pour toi, pour moi, c'est autre chose (surtout en anglais).🤔

Mon problème est que je ne connais pas la longueur de cette liste.

J'ai pris les jours de la semaine comme exemple, je trouvais ça plus "parlant" que ma propre liste...

Denis...

0 J'aime
Message 4 sur 12

patrick.emin
Alumni
Alumni

Voir le site de Didier Aveline : https://www.da-code.fr/mapcar/


Patrick Emin animateur de la communauté francophone


Vous avez trouvé un message utile? Alors donnez un "J'aime" à ce message!
Votre question a eu une réponse satisfaisante? Voulez vous avoir l'amabilité de cliquer sur le bouton
 APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Signez notre Livre d'Or
0 J'aime
Message 5 sur 12

CADaSchtroumpf
Advisor
Advisor

Si tu veux faire des paires pointée à partir de 2 listes, il faut obligatoirement que celles ci soient de même longueur.

Autrement mapcar va tronquer à la liste la plus courte.

pour preuve:

(mapcar '(lambda ( x y ) (cons x y)) '(1 2 3 4 5 6) '("lundi" "mardi" "marcredi" "jeudi" "vendredi" "samedi" "dimanche"))
-> ((1 . "lundi") (2 . "mardi") (3 . "marcredi") (4 . "jeudi") (5 . "vendredi") (6 . "samedi"))


(mapcar '(lambda ( x y ) (cons x y)) '(1 2 3 4 5 6 7) '("lundi" "mardi" "marcredi" "jeudi" "vendredi" "samedi"))
-> ((1 . "lundi") (2 . "mardi") (3 . "marcredi") (4 . "jeudi") (5 . "vendredi") (6 . "samedi"))

 

et sans passer par mapcar :

(cons "toto" nil) -> ("toto") liste simple

(cons nil "toto") -> (nil . "toto") paire pointée dont le premier élément et vide

 

 

0 J'aime
Message 6 sur 12

DenisHen
Advocate
Advocate

Bonjour Patrick et merci pour cette réponse.

Je cherche toujours l'aide sur le site de Maître Didier, découvert grâce à CadXP.

Mais sur cette fonction, j'ai beaucoup de mal.

Je n'arrive pas à incrémenter le premier élément pour en faire ma liste de paires pointées.

J'ai fais plein de testes dans la console, mais je n'arrive à rien...

Denis.

0 J'aime
Message 7 sur 12

DenisHen
Advocate
Advocate

Merci CADaSchtroumpf pour ton aide.

Je vais faire des essais avec ta proposition...

0 J'aime
Message 8 sur 12

Bruno-VDH
Participant
Participant

Bonjour,

 

Comme ceci

(defun consNum (n l)
  (if  l
    (cons (cons n (car l)) (consNum (1+ n) (cdr l)))))

 

_$ (consNum 1 '("lundi" "mardi" "mercredi" "jeudi" "vendredi" "samedi" "dimanche"))
((1 . "lundi") (2 . "mardi") (3 . "mercredi") (4 . "jeudi") (5 . "vendredi") (6 . "samedi") (7 . "dimanche"))

 

Ou en ajoutant un compteur pour la solution avec mapcar

(setq i 0)
(mapcar '(lambda (x) (cons (setq i (1+ i)) x))    '("lundi" "mardi" "mercredi" "jeudi" "vendredi" "samedi" "dimanche") )

 

Salutations

Message 9 sur 12

O_Eckmann
Mentor
Mentor

Si tu ne t'en sors pas avec mapcar, utilise une simple boucle

(setq Liste (list "Lundi" "Mardi"))
(setq i 0)
(repeat (length Liste)
  (setq newListe (append newListe (list (cons (1+ i) (nth i Liste)))))
  (setq i (1+ i))
)

 

Olivier

Olivier Eckmann

EESignature

Message 10 sur 12

_gile
Consultant
Consultant

Salut,

A priori, ce que tu veux faire est inutile. Le principal intérêt des listes de paires pointées est l'accès aux éléments de la liste par 'clé' (avec assoc).

Si la clé est incrémentée elle n'offre de ce point de vue aucun avantage par rapport à la fonction nth.

(nth (1- n)
     '("lundi"
       "mardi"
       "mercredi"
       "jeudi"
       "vendredi"
       "samedi"
       "dimanche"
      )
)

est équivalent à :

(cdr (assoc n
	    '((1 . "lundi")
	      (2 . "mardi")
	      (3 . "mercredi")
	      (4 . "jeudi")
	      (5 . "vendredi")
	      (6 . "samedi")
	      (7 . "dimanche")
	     )
     )
)

 

 



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 11 sur 12

DenisHen
Advocate
Advocate
Solution acceptée

Bonjour à tous, et merci pour votre aide.

J'ai fini par adopter une autre méthode, je construit ma liste directement en liste de paire pointées.

J'avais besoin de paires pointées pour utiliser le LISP de Maître _Gile, "ListBox".

Encore merci à vous.

Denis...

0 J'aime
Message 12 sur 12

Bruno-VDH
Participant
Participant

Bonjour 

Dans l'entête de la fonction listbox, il y avait la solution:

;; Exemple d'utilisation
;; (listbox "Présentation" "Choisir une présentation" (mapcar 'cons (layoutlist) (layoutlist)) 1)

Pour ton cas:

(mapcar 'cons lst lst)

 Cordialement

0 J'aime