以某种方式组合两个列表的方案

时间:2014-04-20 23:24:23

标签: scheme lisp

这是我在Scheme中的第二个问题。说我有2个列表

'("a" "b" "c")

'("e" "f" "g")

我想以这种方式组合它们:

'(("a" "e") ("b" "f") ("c" "g"))

这可能吗?

1 个答案:

答案 0 :(得分:1)

您使用SRFI-1 List library。函数名称为zip。当您apply zipzip结果时,您会回到您开始的位置,因此unzip通常是相同的过程,除了它需要列表列表而不是很多列表参数。

(zip '(1 2 3) '(a b c))         ; ==> ((1 a) (2 b) (3 c))
(unzip '((1 2 3) (a b c)))      ; ==> ((1 a) (2 b) (3 c))
(unzip '((1 a) (2 b) (3 c)))    ; ==> ((1 2 3) (a b c))

如果您点击该链接,您将找到参考实施。但是,您通常不需要它,因为大多数实现都包含它们。例如。在Racket R6RS中,您(import (srfi :1))或使用您(require srfi/1)的球拍语言。在Chicken (declare (uses srfi-1))中,所以实现之间的语法差别很大。

您标记了lisp因此,为了完整性,Common Lisp实现将如下所示:

(defun zip (&rest lsts)
  (apply #'mapcar #'list lsts)) 

(defun unzip (lsts)
  (apply #'mapcar #'list lsts))