2017-06-28 3 views
0

Wie kann ich Elemente zurückgeben, wenn sie in zwei angegebenen Listen sind?Return-Elemente, wenn sie in zwei Listen in lisp sind

Beispiel:

L1 = (a b c d e a b c) 

L2 = (a d f g k c c) 

Result = (a a a c c c c d d) 

Ich möchte Elemente entfernen, die in beiden Listen arent und dann fügen Sie den resultierenden Listen

+1

Von der Stackoverflow-Hilfe: "Fragen, die nach Hausaufgabenhilfe fragen, müssen eine Zusammenfassung der bisherigen Arbeit enthalten, um das Problem zu lösen, und eine Beschreibung der Schwierigkeit, die Sie lösen müssen." –

Antwort

2

Sie können mit einer Hash-Tabelle starten, Zuordnen eines Listenelements auf einem Paar erste Elemente aus der ersten Liste, zweite Elemente aus der zweiten. Dann sammeln Sie die Elemente:

(defun common-elements (l1 l2 &key (test 'eql)) 
    (let ((ht (make-hash-table :test test)) ret) 
    (dolist (e l1) 
     (let ((pair (gethash e ht))) 
     (if pair 
      (push e (car pair)) 
      (setf (gethash e ht) (cons (list e) nil))))) 
    (dolist (e l2) 
     (let ((pair (gethash e ht))) 
     (when pair ; no need to store e when it is not in l1 
      (push e (cdr pair))))) 
    (maphash (lambda (e pair) 
       (declare (ignore e)) 
       (when (cdr pair) ; we know (car pair) is non-nil 
       (setq ret (nconc (car pair) (cdr pair) ret)))) 
      ht) 
    ret)) 
(common-elements '(a b c d e a b c) '(a d f g k c c)) 
==> (A A A C C C C D D) 

Beachten Sie, dass die Reihenfolge, in der die Listenelemente zurückgegeben werden, ist nicht definiert.

+0

Ich habe 'l1 l1' zu' l1 l2' als Parameter der Funktion geändert und habe es mit '(common-elements (abc) '(bbc))' Fehler zurückgegeben: *** - NCONC: C ist keine Liste –

+2

überlege, den Code zu reparieren, um ein Teil deiner Hausarbeit zu sein. ;-) – sds