(map list (list 1 2 3) (list 4 5 6))
(define (interleave . args)
(map list args))
(interleave (list 1 2 3) (list 4 5 6) (list 7 8 9))
第一个函数返回一个交错((1 4)(2 5)(3 6)) 更好的是它会在任意数量的列表上交错(我需要) 但是我的交错函数返回(((1 2 3))((4 5 6))((7 8 9)))
如何解压args列表,以便map可以映射列表中的列表?
答案 0 :(得分:3)
这称为zip
:
(define (zip . args)
(apply map list args))
(zip '(1 2 3) '(a b c) '(I II III)) ; ==> ((1 a I) (2 b II) (3 c III))
(apply zip '((1 a I) (2 b II) (3 c III))) ; ==> ((1 2 3) (a b c) (I II III))
您会在SRFI-1 List Library中找到zip
,因此很多实现都可以启用它,或者您只需在导入列表中包含(srfi :1)
的r6rs。
您还有unzip
zip
,但它需要列表而不是许多参数。它几乎与zip
相反:
(define (unzip lsts)
(apply map list lsts))
(unzip '((1 a I) (2 b II) (3 c III))) ; ==> ((1 2 3) (a b c) (I II III))
(unzip '((1 2 3) (a b c) (I II III))) ; ==> ((1 a I) (2 b II) (3 c III))
在SRFI-1中,您unzip1
... unzip5
实际上更接近于zip
,因为它返回多个值:
(unzip3 '((1 a I) (2 b II) (3 c III))) ; ==> (1 2 3); (a b c); (I II III)
答案 1 :(得分:1)
您可以使用apply
:
(define (interleave . args)
(apply map list args))