2010-04-11 15 views

Respuesta

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

o

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

¡Perfecto! - justo lo que necesitaba. – Cheeso

+1

'nconc' (y' mapcan') puede ser malo para su salud. –

+1

@eli: Ciertamente. Pero en el ciclo de arriba está bien, ¿o no? El ciclo interno devuelve listas nuevas, por lo que 'nconc'ing está bien. – Dirk

3

Esa es una pregunta típica tarea. En general, esta operación se llama FLATTEN (que aplana listas en todos los niveles).

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

El SOLICITAR variante tiene el problema de que puede funcionar en la llamada-argumentos-LIMIT cuando hay más sublistas que CALL-argumentos de LIMIT.

Véase, por ejemplo, también http://rosettacode.org/wiki/Flatten_a_list#Common_Lisp

+0

Gracias por la útil respuesta. Definitivamente no fue tarea para mí. Tal vez hace 20 años, podría haber tenido eso como una pregunta para la tarea, pero no puedo recordar eso ahora, ahora! – Cheeso

+0

@ Cheeso: era una pista de que puedes encontrar soluciones para ello ... –

0

Puede también utilizar reduce y append:

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

Desafortunadamente esto es mucho menos tiempo y espacio eficiente que las otras soluciones porque llama append mucho y copia los resultado en progreso innecesariamente.