2013-06-24 36 views
0

我需要帮助完成一个解压缩列表并返回两个列表的列表的解压缩函数。我要的是如下结果...针对多个列表的方案递归解压缩函数

(unzip '((a b) (1 2))) 
'((a 1) (b 2)) 

(unzip '((a 1) (b 2) (c 3))) 
'((a b c) (1 2 3)) 

(unzip '(unzip '())) 
'(()()) 

我可以让我的代码为空的情况下,用含两份名单列表一起工作,但我有一个很难搞清楚如何使它递归并为超过2个列表工作,如第二个例子。

(define (unzip l) 
    (if (null? l) 
     '(()()) 
     (map list (car l) (car (cdr l))))) 

这对于空列表或两个列表可以正常工作,但我很难设置递归部分以使用三个或更多列表。

回答

4

这是一个非常标准的操作,它相当于查找列表列表的转置。它通常是这样实现的:

(define (unzip lst) 
    (apply map list lst)) 

它可以用于前两个例子。第三,我认为是不明确的,但如果你想使它适用于那种奇怪的情况,我会把它作为一个练习;)

请注意,如果你解压缩列表,你会得到原始的输入......意思是unzip也是zip

(unzip '((a b) (1 2) (x y))) 
=> '((a 1 x) (b 2 y)) 

(unzip '((a 1 x) (b 2 y))) 
=> '((a b) (1 2) (x y)) 
+0

好吧,我是很接近。我知道我想使用地图列表,但只是有点关闭。感谢您的帮助。 – Yoink

1
(apply map list '((a 1) (b 2) (c 3) (d 4) (e 5))) 

;Value 16: ((a b c d e) (1 2 3 4 5)) 

该做的。顺便说一句同样的伎俩会为荏苒以及,提供所有列表的长度是相同的:

(apply map list (list '(a b c d e) '(1 2 3 4 5))) 

;Value 17: ((a 1) (b 2) (c 3) (d 4) (e 5)) 
+2

如果使用SRFI 1,则列表不需要具有相同的长度:映射在最短列表停止时停止。 –

0

您是否知道,在计划一个函数可以返回多个值吗?

(define (unzip list) 
    (values (map car list) 
      (map cadr list))) 

,然后用它是这样的:

(let-values ([(z1 z2) (unzip '((a 1) (b 2)))])  
    ;; Use z1 and z2 
    ...)