Aller au contenu

Compter nb élément identique dans une liste


Messages recommandés

Posté(e)

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...

Posté(e)

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

Posté(e)

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...

Posté(e)

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

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)

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...

  • 8 mois après...
Posté(e)

(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

Posté(e)

Salut

Ou 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 Patrick

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

Joseph Joubert, 1754-1824

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é