Aller au contenu

[Résolu] Comment ajouter 1 à un élément d'une liste ?


DenisHen
 Partager

Messages recommandés

Bonjour à la communauté.
J'aimerais comptabiliser des entités de mon dessin qui sont dans une liste, mais je ne sais pas comment faire.
J'aimerais, en fait, ajouter 1 à un élément d'une liste. Ma liste est

(setq ListNb (list 0 0 0 0 0 0))

Et lorsque je rencontre une entité qui serait en troisième position, il faudrait ajouter 1 au troisième élément de la liste ListNb, ce qui donnera ListNb = 0 0 1 0 0 0

Windows 10 Pro 64bits / AutoCAD 3D 2022

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @DenisHen

Tu ne prends pas la peine de regarder ce qui a déjà été fait (cette phrase a un petit air de répétition)
(gile) a pourtant pris le soin de créer et de mettre à notre disposition plein de bibliothèques franchement terribles.

Je te laisse chercher cette fonction "gc:SubstAt" pour admirer le travail partagé et le remercier.

Amicalement
 

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

Regarde avec quelque chose comme ceci :

(defun foo (lst fun val pos)
  (cond
    ( (null lst) lst)
    ( (zerop pos) (append (list (apply fun (vl-remove nil (list (car lst) val)))) (cdr lst)))
    ( (cons (car lst) (foo (cdr lst) fun val (1- pos))))
  )
)

Pour ton exemple tu peux utiliser

(setq ListNb (foo ListNb '+ 1 2))
(0 0 1 0 0 0)

ou bien

(setq ListNb (foo ListNb '1+ nil 2))
(0 0 1 0 0 0)

Sachant que le premier élément de la liste correspond à l'index 0

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

@VDH-Bruno: merci pour ton aide.

@didier : j'avais bien regardé les codes de Maître (gile), mais je ne pensais pas que cette commande me servirait, après ta remarque, j'ai approfondi et fini par trouver. Donc, un grand merci...

@Luna : merci pour ton aide.

Windows 10 Pro 64bits / AutoCAD 3D 2022

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).

Lien vers le commentaire
Partager sur d’autres sites

Rebonjour.
Voilà, je tente désespérément d'utiliser gc:SubstAt de Maître (gile).
Mais ça me sort une erreur. Voici mon bout de code :

(setq Text (str2lst Item ";"))
    (setq Pos (atoi (nth 0 Text)))
    (princ "\nPos=")
    (princ Pos) ;; Pos est un INTEGER
    (princ "\n(nth Pos ListNbTS)=")
    (princ (nth Pos ListNbTS)) 
    (setq ele (+ (nth Pos ListNbTS) 1)) ;; ListNbTS est une LIST
    (princ "\nele=")
    (princ ele) ;; ele est un INTEGER
    (princ "\nDrapeau 03")
    (setq ListNbTS (gc:SubstAt (ele Pos ListNbTS)))
    (princ "\nDrapeau 04")

Et voici le résultat dans ma ligne de commande :

Citation

Pos=1
(nth Pos ListNbTS)=0
ele=1
Drapeau 03; erreur: fonction incorrecte: 1

Sachant que ListNbTS ne contient, pour l'instant, que des 0, et non des "0".

Windows 10 Pro 64bits / AutoCAD 3D 2022

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).

Lien vers le commentaire
Partager sur d’autres sites

il y a une heure, Luna a dit :

Coucou,

Regarde avec quelque chose comme ceci :

(defun foo (lst fun val pos)
  (cond
    ( (null lst) lst)
    ( (zerop pos) (append (list (apply fun (vl-remove nil (list (car lst) val)))) (cdr lst)))
    ( (cons (car lst) (foo (cdr lst) fun val (1- pos))))
  )
)

Pour ton exemple tu peux utiliser

(setq ListNb (foo ListNb '+ 1 2))
(0 0 1 0 0 0)

ou bien

(setq ListNb (foo ListNb '1+ nil 2))
(0 0 1 0 0 0)

Sachant que le premier élément de la liste correspond à l'index 0

Bisous,
Luna

Bonjour Luna, 

Pour le retour et pour le jeu:

(append (list (apply fun (vl-remove nil (list (car lst) val)))) (cdr lst))

J'aurais fait un (cons ..., plutôt qu'un (append (list ... et un (cons (car lst) (cond (val (list val)))) plutôt qu'un (vl-remove nil (list (car lst) val)

ce qui aurait donné un:

(cons (apply fun (cons (car lst) (cond (val (list val))))) (cdr lst))

Après c'est juste une écriture différente car je trouvais amusant pour l'exercice de vouloir gérer 1+ ou + en argument de fun, même si personnellement je ne l'aurais pas tenté et me serais contenté d'une écriture plus classique comme ceci:

(defun foo (fun val ind lst)
  (cond
    ((null lst) nil)
    ((zerop ind) (cons ((eval fun) (car lst) val) (cdr lst)))
    ((cons (car lst) (foo fun val (1- ind) (cdr lst))))
  )
)
$ (foo '+ 1 2 '(0 0 0 0 0 0))
(0 0 1 0 0 0)

"Cha"lutations😉

  • Upvote 1

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

J'ai ma liste de base qui est ListNbTS qui ne contient que des 0 (zéro).
J'aimerais ajouter 1 à un élément de cette liste à la position Pos. Si Pos=2, ListNbTS sera (0 0 1 0 0 ......)
Ensuite, si dans ma boucle je retombe sur Pos=2, j'ajouterais 1 à l'élément  à dette position, ListNbTS sera (0 0 2 0 0 ......)
Et ainsi de suite...

Windows 10 Pro 64bits / AutoCAD 3D 2022

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).

Lien vers le commentaire
Partager sur d’autres sites

_$ (setq ListNbTS '(0 0 0 0 0 0))
(0 0 0 0 0 0)
_$ (setq ListNbTS (foo '+ 1 2 ListNbTS))
(0 0 1 0 0 0)
_$ (setq ListNbTS (foo '+ 1 2 ListNbTS))
(0 0 2 0 0 0)
_$ 

 

ou bien

_$ (setq ListNb '(0 0 0 0 0 0))
(0 0 0 0 0 0)
_$ (setq ListNb (cons (car ListNb) (cons (cadr ListNb) (cons (1+ (caddr ListNb)) (cdddr ListNb)))))
(0 0 1 0 0 0)
_$ (setq ListNb (cons (car ListNb) (cons (cadr ListNb) (cons (1+ (caddr ListNb)) (cdddr ListNb)))))
(0 0 2 0 0 0)

 

Qu'elle est le problème je comprend pas la question?

Salutations

  • Upvote 1

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Mille mercis Bruno.
Ca fonctionne à merveille ! ! !

Windows 10 Pro 64bits / AutoCAD 3D 2022

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).

Lien vers le commentaire
Partager sur d’autres sites

@VDH-Bruno vui la première écriture que j'avais testée c'était avec(

(cons ((eval fun) ...) ...)

Sauf que mon esprit n'a pas pu s'empêcher de penser à prévoir toujours un peu plus (encore et toujours) ^^"
Du coup j'ai ensuite essayer de prévoir le coup avec les fonctions qui n'ont pas d'argument (et j'ai plus l'habitude de passer par (apply) dans ces cas là à cause de (ssget), lorsque j'ai travaillé sur ce principe à l'époque. Et du coup j'avais re-modifié une 3ème fois pour intégrer aussi les fonctions ayant un nombre variable d'arguments (avec val sous forme de liste).
Bref, j'ai complexifié l'écriture de la fonction au fur et à mesure que j'écrivais mon message sur CADxp ^^" donc j'ai pas trop réfléchi à re-simplifier ensuite la façon d'y parvenir.

Mais en théorie chat fonctionnait malgré tout >n<

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

il y a une heure, Luna a dit :

@VDH-Bruno vui la première écriture que j'avais testée c'était avec(

(cons ((eval fun) ...) ...)

Sauf que mon esprit n'a pas pu s'empêcher de penser à prévoir toujours un peu plus (encore et toujours) ^^"
Du coup j'ai ensuite essayer de prévoir le coup avec les fonctions qui n'ont pas d'argument (et j'ai plus l'habitude de passer par (apply) dans ces cas là à cause de (ssget), lorsque j'ai travaillé sur ce principe à l'époque. Et du coup j'avais re-modifié une 3ème fois pour intégrer aussi les fonctions ayant un nombre variable d'arguments (avec val sous forme de liste).
Bref, j'ai complexifié l'écriture de la fonction au fur et à mesure que j'écrivais mon message sur CADxp ^^" donc j'ai pas trop réfléchi à re-simplifier ensuite la façon d'y parvenir.

Mais en théorie chat fonctionnait malgré tout >n<

Bisous,
Luna

Oui oui ça fonctionnait bien et apply est une bonne habitude dans le cas d'un nombre d'argument variable... C'est juste que ça faisait longtemps que je n'avais tapé qq lignes de Lisp et ça me démangeait, donc je me suis fait plaisir.

Amicalement

Bruno 

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Et pourquoi pas une liste de paire pointée pour un accès direct

(setq lsNB (list (cons 1 0) (cons 2 0) (cons 3 0) (cons 4 0) (cons 5 0)))

 

(defun AjoutAListe ( liste index nombre / )
  (subst (cons index (+ nombre (cdr (assoc index liste)))) (assoc index liste) liste)
)
;Ajouter 2 à l'élément n° 3
(setq lsNB (AjoutAListe lsNB 3 2))

 

Olivier

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

il y a une heure, DenisHen a dit :

Mille mercis Bruno.
Ca fonctionne à merveille ! ! !

@DenisHen, juste une petite observation au passage mais loin de moi l'idée de me poser en donneur de leçon, mais j'ai l'impression que tu butes souvent sur les mêmes problèmes, qui de mon point de vue n'ont rien avoir avec le langage de programmation que ce soit vba, lisp etc...

Car bien souvent le problème se situe en amont, pour mon cas personnelle je passe en général plus de temps à exprimer clairement ce que je cherche à faire, plutôt qu'à le coder. Je te livre deux petites maximes bien connu que je me répète lorsque je bute sur un problème:

La première: « Ce que l’on conçoit bien s’énonce clairement »

Puis la seconde qui découle de la précédente: « Un problème bien posé est à moitié résolu ! »

Et en général lorsque mon raisonnement répond à ces 2 maximes, le code s'écrit aisément.  

  • Like 1

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Merci Bruno pour ces précieux conseils.
Je les observerais désormais.
Mais c'est un exercice que je n'ai pas l'habitude de faire, il est vrai que je code avant d'avoir mon "cahier des charges" ou ma trame à suivre.
Denis.

Windows 10 Pro 64bits / AutoCAD 3D 2022

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).

Lien vers le commentaire
Partager sur d’autres sites

Salut @Curlygoth, ça faisait longtemps... 😉 
C'est ce que je commence à faire...
J'ai maintenant plein de petites "routines" que j'appelle depuis d'autres...

Windows 10 Pro 64bits / AutoCAD 3D 2022

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @(gile), je sais pertinemment que ce que tu fais fonctionne parfaitement.
Il y a juste que je n'y arrivais pas.
Loin de moi l'idée d'incriminer tes codes 😉.
Je me sert de pas mal des tes routines et c'est un régal...

Windows 10 Pro 64bits / AutoCAD 3D 2022

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).

Lien vers le commentaire
Partager sur d’autres sites

Non, je n'ai pas compris pourquoi je n'y arrivais pas (et ça me désole), mais j'y arrive avec la solution de Bruno.

Windows 10 Pro 64bits / AutoCAD 3D 2022

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).

Lien vers le commentaire
Partager sur d’autres sites

il y a 6 minutes, DenisHen a dit :

Non, je n'ai pas compris pourquoi je n'y arrivais pas (et ça me désole), mais j'y arrive avec la solution de Bruno.

Compare l'exemple donné par (gile):

il y a 29 minutes, (gile) a dit :

_$ (gc:SubstAt 1 3 '(0 0 0 0 0))
(0 0 0 1 0)

 Et la façon dont tu as appelé sa fonction dans ton code:

Il y a 4 heures, DenisHen a dit :
(setq ListNbTS (gc:SubstAt (ele Pos ListNbTS)))

 Que remarques tu?

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Ok, je viens de piger, enfin je crois 

(setq ListNbTS (gc:SubstAt ele Pos ListNbTS))

Toujours ce problème de parenthèses...

Windows 10 Pro 64bits / AutoCAD 3D 2022

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).

Lien vers le commentaire
Partager sur d’autres sites

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
 Partager

×
×
  • 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é