Bred Posté(e) le 13 juillet 2006 Posté(e) le 13 juillet 2006 Salut,je cherche, je cherche mais je ne trouve pas....Je cherche à compter le nombre d'élément identique dans une liste, et je ne trouve pas de fonction approprié... genre :ex : setq liste (liste "vis" "vis" "ecrou" "vis" "vis" "ecrou") la commande (du style):TOTO "vis" liste ----> 4 ... ça m'étonnerais quand même que ça n'existe pas "d'office" .... j'ai commencé à écrire une routine pour y répondre, elle n'est pas du tout au point, et c'est tellement "tordu", que je prefère poser la question avant de continuer... (setq list_Bloc_Imb_final (list (nth 0 list_Bloc_Imb))) (setq index 1) (repeat (length (1- list_Bloc_Imb)) (setq nom_obj (nth index list_Bloc_Imb)) (setq indexU (1+ index)) (setq Nb_Ob 1) (repeat (length list_Bloc_Imb) (if (equal (nth index list_Bloc_Imb) (nth indexU list_Bloc_Imb)) (setq Nb_Ob (1+ Nb_Ob))) ) (setq list_Bloc_Imb_final (append list_Bloc_Imb_final (list (cons Nb_Ob (nth index list_Bloc_Imb))))) ) ... merci d'avance !!! Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
bonuscad Posté(e) le 13 juillet 2006 Posté(e) le 13 juillet 2006 Une manière! (defun toto (lst el / count) (setq count 0) (foreach n lst (if (apply 'eq (list n el)) (setq count (1+ count)) ) ) (print count) (prin1))(toto (list "vis" "vis" "ecrou" "vis" "vis" "ecrou") "vis") -> 4 Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Bred Posté(e) le 13 juillet 2006 Auteur Posté(e) le 13 juillet 2006 Alors là.... :o je me suis tellement tordu la tête pour trouver , que de voir avec quel simplicité cela peut être traité me Dé-Goutte !!!! ... en tout cas, merci !!!!------------------------------------------------------------Pour que ce soit + clair pour moi, afin de bien comprendre la procédure, j'ai "commentariser" la routine proposé. Je la retranscris ci-dessous pour des personnes qui, comme moi, ont du mal... :P (defun toto (lst el / count) (setq count 0) (foreach n lst ; passe lst en revu en mettant un élément dans n puis ... (if (apply 'eq (list n el)) ; ....applique la fonction "eq"(=) à ( n et el ). (setq count (1+ count)) ;si T = count + 1. );si nil, rien. ) (print count) ; écrire le nombre d'élément. (prin1) ) [Edité le 13/7/2006 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
bonuscad Posté(e) le 13 juillet 2006 Posté(e) le 13 juillet 2006 voir avec quel simplicité cela peut être traité Ceci est un atout majeur du lisp!Pour te rassurrer, j'ai mis longtemps avant de les utiliser à bon escient (je fais encore des "bourdes")Autant il peut être relativement simple de comprendre (mapcar) (apply) (foreach) (lambda) individuellement et les fonctions récursives en théorie, qu'il est beaucoup plus difficile de les mettre en oeuvre en pratique . Leurs imbrications donne un aspect "magique" aux fonctions, mais il n'est pas toujours facile de percevoir cet imbrication que l'on peux faire quand on doit construire sa fonction. Seule la pratique et l'expérience d'autrui t'ammène peu à peu à ce genre de construction de code. Moi je suis encore émerveillé par les fonctions récursive de Yevgeny Yelpanov que j'ai du mal à saisir. Voir une de ces leçon (en russe traduite en anglais par automatisme) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Tramber Posté(e) le 13 juillet 2006 Posté(e) le 13 juillet 2006 Plus moderne encore : (length(vl-remove-if-not '(lambda (x)(= x "vis"))(list "vis" "vis" "ecrou" "vis" "vis" "ecrou"))) Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Bred Posté(e) le 13 juillet 2006 Auteur Posté(e) le 13 juillet 2006 Ah ! ouais, ouais, ouais.....merci Tramber.... ... c'est sympa .... je vais passer un bon Week-end moi....completement dégoutté !!! Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
ElpanovEvgeniy Posté(e) le 11 avril 2007 Posté(e) le 11 avril 2007 (setq l '( "vis" "vis" "ecrou" "vis" "vis" "ecrou"))variant 1 (apply '+(mapcar '(lambda(x)(if (= x "vis")1 0))l)) variant 2 (defun count (l x) (if (= x (car l)) (1+ (count (cdr l) x)) (if l (count (cdr l) x) 0 ) ;_ if ) ;_ if ) ;_ defun (count l "vis") [Edité le 11/4/2007 par ElpanovEvgeniy] Evgeniy
Patrick_35 Posté(e) le 11 avril 2007 Posté(e) le 11 avril 2007 SalutOu encore de cette manière(setq l '( "vis" "vis" "ecrou" "vis" "vis" "ecrou") lst '()) (while (setq ent (car l)) (setq nb (length l) l (vl-remove ent l) lst (cons (cons ent (- nb (length l))) lst) ) ) ===> liste lst ===> (("ecrou" . 2) ("vis" . 4))---> (cdr (assoc "ecrou" lst)) ---> 2 @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
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