2014-07-22 104 views
1

因此,例如,我有这样的名单:L ((a 1) (b 2) (c 3)) ((d 4) (e 5) (f 6))
我怎样才能把它转换成 ((a 1) (b 2) (c 3) (d 4) (e 5) (f 6))合并列表的列表到一个列表方案

一个包含两个列表,我需要做一个名单列表包含列表。

我知道,如果我的车LI获得前半((a 1) (b 2) (c 3)),如果我cdrL我得到的后半 (((d 4) (e 5) (f 6)))但我无法弄清楚如何把它变成形式 ((a 1) (b 2) (c 3) (d 4) (e 5) (f 6))

回答

3

对于“结合”两列表(无论其内容如何),请使用append。并且访问列表的第一个和第二个元素使用(car x)(cadr x) - 这是(car (cdr x))的简写。例如:

(define lst '(((a 1) (b 2) (c 3)) ((d 4) (e 5) (f 6)))) 

(append (car lst) (cadr lst)) 
=> '((a 1) (b 2) (c 3) (d 4) (e 5) (f 6)) 

对于与子列表任意数量的作品更广泛的解决方案,使用apply参考@ uselpa的优良的答案。或者,如果你使用的球拍,append*还将多个子表工作:

(define lst '(((a 1) (b 2) (c 3)) ((d 4) (e 5) (f 6)) ((g 7) (h 8) (i 9)))) 

(append* lst) 
=> '((a 1) (b 2) (c 3) (d 4) (e 5) (f 6) (g 7) (h 8) (i 9)) 
+1

非常感谢您的快速回复!当它让我时,我会标记为答案。 – Crowlands

+1

@Crowlands太棒了!这是我的荣幸:) –

2

为了配合奥斯卡的答案,(apply append ...)适用于任何数量的子表:

(define L '(((a 1) (b 2) (c 3)) 
      ((d 4) (e 5) (f 6)))) 
(apply append L) 
=> '((a 1) (b 2) (c 3) (d 4) (e 5) (f 6)) 

(define G '(((a 1) (b 2) (c 3)) 
      ((d 4) (e 5) (f 6)) 
      ((g 7) (h 8) (i 9)))) 
(apply append G) 
=> '((a 1) (b 2) (c 3) (d 4) (e 5) (f 6) (g 7) (h 8) (i 9)) 
+0

所以'应用'只是结合了第一级列表? – Crowlands

+1

'应用append'呢。 '(应用追加(L1 L2 L3 ...))与'(追加L1 L2 L3 ...)'相同,所以'apply'去掉一个括号。它也适用于其他程序。 – uselpa

+1

@Crowlands或者如果你碰巧使用球拍,'append *'也可以用于多个子列表;) –