2010-04-11 34 views

Antwort

7
(apply #'append '((a b c) (d e f) (g h i))) 

oder

(loop for outer in '((a b c) (d e f) (g h i)) 
     nconcing (loop for inner in outer collecting inner)) 
+0

Perfekt! - genau das, was ich brauchte. – Cheeso

+1

'nconc' (und' mapcan') kann schlecht für Ihre Gesundheit sein. –

+1

@eli: Sicher. Aber in der Schleife oben ist es in Ordnung, oder ist es? Die innere Schleife gibt neue Listen zurück, so dass 'nconc'ing in Ordnung ist. – Dirk

3

, dass eine typische Hausaufgaben Frage ist. Im Allgemeinen heißt diese Operation FLATTEN (die Listen auf allen Ebenen flacht).

(mapcan #'copy-list '((a b c) (d e f) nil (g h))) 

Die Variante GILT hat das Problem, dass es in der CALL-ARGUMENTE-LIMIT laufen können, wenn es mehr als Sublisten ANRUF-ARGUMENTE-LIMIT.

Siehe zum Beispiel auch http://rosettacode.org/wiki/Flatten_a_list#Common_Lisp

+0

Danke für die hilfreiche Antwort. Es war definitiv keine Hausaufgabe für mich. Vor vielleicht 20 Jahren hätte ich das vielleicht als Hausaufgabe gehabt, aber ich kann mich nicht mehr so ​​weit zurück erinnern! – Cheeso

+0

@Cheeso: Es war ein Hinweis, dass Sie Lösungen dafür finden können ... –

0

Sie auch reduce und append verwenden können:

(reduce #'append '((a b c) (d e f) nil (g h))) 

Leider ist dies viel weniger Zeit und Raum effizienter als die anderen Lösungen, weil es append fordert viel und kopiert die Ergebnis in Arbeit unnötigerweise.

Verwandte Themen