2013-06-24 37 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 
    ...)