2016-03-24 5 views
1

Ich mache eine lisp bezogene Zuordnung für die Klasse und eines der Probleme erfordert, dass wir mapcar verwenden, um ein Element aus einer Liste zu extrahieren (ob das bedeutet, dass er möchte, dass wir es drucken oder einfach entfernen, ich don Ich weiß, dass er es gerne drucken würde.)Extrahieren eines Elements aus einer Liste von Listen?

Ich verstehe im Allgemeinen mit etwas wie (nth 3 (list 1 2 3 4)), um das dritte Element aus der Liste zu bekommen, aber mit mapcar macht dies übermäßig kompliziert - vor allem wenn die Daten, die er uns testen lassen soll (er will, dass wir die Sozialversicherungsnummern extrahieren):

((olsen jimmy 123-76-4535 cub-reporter) 
(kent clark 089-52-6787 reporter) 
(lane lois 951-26-1438 reporter) 
(white perry 355-16-7439 editor)) 

Könnte jemand mich auf h leiten ow genau dies mit mapcar tun? Ich habe nach Weblinks gesucht, und es scheint, als ob mapcar allgemein verwendet wird, um etwas JEDES Element in einer Liste zu tun, nicht ein einzelnes Element. (Oder vielleicht verstehe ich das Problem falsch?)

+0

"Im Allgemeinen verstehe ich die Verwendung von etwas wie (nth 3 (Liste 1 2 3 4)), um den dritten Punkt zu bekommen" - Ich hoffe, es gibt die vierte in Ihrem Lispeln. nth beginnt bei 0, also (nth 0 '(1 2 3 4)) würde 1 zurückgeben. – kennytilton

Antwort

1

Ich schaffte es tatsächlich herauszufinden - es war überraschend einfach, alles, was Sie wirklich brauchten, war "dritte" auf der Liste der Elemente zu tun. Mein Ergebniscode war:

(setf daily-planet 
    '((olsen jimmy 123-76-4535 cub-reporter) 
     (kent clark 089-52-6787 reporter) 
     (lane lois 951-26-1438 reporter) 
     (white perry 355-16-7439 editor))) 

(mapcar #'third daily-planet) 

Und es hat funktioniert!

1
CL-USER 26 > (setf daily-planet 
        '((olsen jimmy 123-76-4535 cub-reporter) 
        (kent clark 089-52-6787 reporter) 
        (lane lois 951-26-1438 reporter) 
        (white perry 355-16-7439 editor))) 

((OLSEN JIMMY |123-76-4535| CUB-REPORTER) (KENT CLARK |089-52-6787| REPORTER) 
(LANE LOIS |951-26-1438| REPORTER) (WHITE PERRY |355-16-7439| EDITOR)) 

Ihre Lösung:

CL-USER 27 > (mapcar #'third daily-planet) 

(|123-76-4535| |089-52-6787| |951-26-1438| |355-16-7439|) 

Erforschung der Alternativen

Nur eine Lambda-Funktion nichts zu tun. Es gibt nur jedes Element:

CL-USER 28 > (mapcar #'(lambda (x) 
         x) 
        daily-planet) 

((OLSEN JIMMY |123-76-4535| CUB-REPORTER) (KENT CLARK |089-52-6787| REPORTER) 
(LANE LOIS |951-26-1438| REPORTER) (WHITE PERRY |355-16-7439| EDITOR)) 

Jetzt third mit dem dritten Element jedes sublist zuzugreifen:

CL-USER 29 > (mapcar #'(lambda (x) 
         (third x)) 
        daily-planet) 

(|123-76-4535| |089-52-6787| |951-26-1438| |355-16-7439|) 

Jetzt NTH mit dem dritten Element jedes sublist zuzugreifen:

CL-USER 30 > (mapcar #'(lambda (x) 
         (nth 2 x)) 
        daily-planet) 

(|123-76-4535| |089-52-6787| |951-26-1438| |355-16-7439|)