如何在列表中添加列表作为元素?

时间:2013-01-02 22:35:51

标签: list append common-lisp

出于演示目的,

我列表中有一个列表:

 > (setf x (list '(1 2 1) '(4 5 4)))
 ((1 2 1) (4 5 4))
 > (length x)
 2

我想为它添加一个新列表'(2 3 2)。 附加功能:

 > (append '(2 3 2) x)
 (2 3 2 (1 2 1) (4 5 4))

 > (length (append '(2 3 2) x))
 5

并没有真正做我想做的事。

我想要的是像这样添加'(2 3 2):

((8 7 8) (1 2 1) (4 5 4))

这样长度为3。

到目前为止,我还没有看到任何例子或方法来做我想要的事情。是否有内置功能或有效的方法?

2 个答案:

答案 0 :(得分:4)

APPEND不是破坏性的功能,这就是你要求的。 APPEND做的是分配一个新的列表,然后返回。

您可以采取的措施是:

(setf x (append '((...)) x)) ;;appends the quoted list to x

还有函数NCONC,它可以破坏性地调整指针。

对于你的冥想,我提出了示例工作:

CL-USER> (defparameter *x* nil)
*X*
CL-USER> (setf *x* '((1 2 3) (4 5 6)))
((1 2 3) (4 5 6))
CL-USER> (append *x* '(10 11 12))
((1 2 3) (4 5 6) 10 11 12)
CL-USER> (append *x* '((10 11 12)))
((1 2 3) (4 5 6) (10 11 12))
CL-USER> (setf *x* (append *x* '((10 11 12))))
((1 2 3) (4 5 6) (10 11 12))
CL-USER> *x*
((1 2 3) (4 5 6) (10 11 12))
CL-USER> 

答案 1 :(得分:2)

APPEND附加列表。如果您有两个子列表((1 2 1) (4 5 4))的列表,并且想要在其前面添加另一个子列表((2 3 2))的列表。

CL-USER 99 > (append '((2 3 2)) '((1 2 1) (4 5 4)))
((2 3 2) (1 2 1) (4 5 4))

或使用此项,如果您想在列表前面添加一个项目:

CL-USER 98 > (cons '(2 3 2) '((1 2 1) (4 5 4)))
((2 3 2) (1 2 1) (4 5 4))