将列表列表合并到Scheme中的一个列表中

时间:2014-07-22 19:44:52

标签: list scheme

例如,我有这个列表: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))

包含两个列表的列表,我需要创建一个包含列表的列表。

我知道如果我开车L我得到前半部分((a 1) (b 2) (c 3))如果我cdr L我得到后半部分 (((d 4) (e 5) (f 6)))但我无法弄清楚如何将其变成表格 ((a 1) (b 2) (c 3) (d 4) (e 5) (f 6))

2 个答案:

答案 0 :(得分:4)

要“合并”两个列表(无论其内容如何),请使用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))

有关适用于任意数量子列表的更通用解决方案,请参阅@ uselpa使用apply的正确答案。或者,如果您使用的是Racket,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 :(得分:2)

为了补充Oscar的答案,(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))