2017-06-28 1 views
0

Ich möchte die Elemente in einer Liste zählen und eine Liste zurück, die Elemente gepaart mit ihnen entsprechenden MengeCount Elemente und bringt sie

So etwas Ähnliches enthalten:

Eingang: (count-elements '(a b d d a b c c b d d))

Ausgang : ((a 2) (b 3) (d 4) (c 2))

Wie kann ich es tun? Ich habe keinen Erfolg versucht, das Element und seine Buchhaltung zu paaren

+2

Sie sollten Ihre früheren Bemühungen auf die Frage hinzufügen. Vielleicht gehst du mehr ins Detail, was genau dir hier Probleme bereitet. :) – Markus

+0

Wenn Sie '((a 1) (b 3) (d 4) (c 2))' 'und das Symbol' a 'erhalten haben, wie würden Sie eine neue Liste erzeugen ((a 2) (b 3) (d 4) (c 2)) – coredump

Antwort

1

Ihr Problem kann in drei große Teile unterteilt werden:

  1. Dublettenerkennung/Löschen: Dies kann entweder durch das Entfernen aller Duplikate erfolgen von jedem Element, oder indem Sie wissen, dass das aktuelle Element ein Duplikat ist (und es somit nicht als neues Element zählt). Dies (die frühere Strategie) kann mit Hilfe der Funktion remove-duplicates
  2. Zählen: Ein Weg zur tatsächlichen zählen die Elemente. Dies kann durch die Funktion count
  3. Kombination: Eine Möglichkeit, die Ergebnisse in einer Liste zu kombinieren. Dies kann durch das Makro push erfolgen.

Der Code:

(defun count-elements (lst) 
    (loop for i in (remove-duplicates lst) 
     with ans = nil 
     do (push (list i (count i lst)) ans) 
     finally (return ans))) 

CL-USER> (count-elements '(a a b c)) 
((C 1) (B 1) (A 2)) 
CL-USER> (count-elements '(a b c d d a b s a c d)) 
((D 3) (C 2) (A 3) (S 1) (B 2)) 
CL-USER> 

HINWEIS: Das Ergebnis nicht angeordnet werden können, wie Sie den Wert erwarten würde, von remove-duplicates


EDIT zurück wegen: Wie Mit coredump würde eine bessere Version von count-elements lauten:

(defun count-elements (lst) 
    (map 'list 
     (lambda (e) 
     (list e (count e lst))) 
     (remove-duplicates lst))) 

die statt loopmap verwendet.

+1

Wenn Sie remove-duplicates verwenden, kann die Kombination als map ausgedrückt werden: '(map 'list (lambda (e) (Liste e (count e sequence))) (remove-duplicates sequence))' – coredump

+0

Das ist ordentlich! Alter! Danke! @Core-Dump. – Mooncrater