我想采用任意列表并“旋转”它。也就是说,对于大小为3x3的列表列表:
#lang racket
(require rackunit)
(define (rotate-lol lol)
(append (list (map first lol)) (list (map second lol)) (list (map third lol))))
(check-equal? (rotate-lol (list (list 'a 'b 'c)
(list 'd 'e 'f)
(list 'g 'h 'i)))
(list (list 'a 'd 'g)
(list 'b 'e 'h)
(list 'c 'f 'i)))
我在想list-ref
将取代first
/ second
/ third
,但我无法找到最简洁的方法来做到这一点。
我知道必须有一种优雅的方式来做到这一点。我在过去对这个问题做了一些不太优雅的解决方案,这些解决方案更具针对性,但是我想在一般情况下解决这个问题,将其存放在个人库中,然后解决问题。任何提示或解决方案?
答案 0 :(得分:5)
它非常像zip
,因为它已经在SRFI-1 list library中,所以你不必这样做:
(require srfi/1)
(zip '(a b c) '(d e f) '(g h I)) ; ==> ((a d g) (b e h) (c f i))
现在要将所有参数作为您使用的列表应用:
(apply zip '((a b c) (d e f) (g h I)))
; ==> ((a d g) (b e h) (c f i))
而且,只是为了完整性。以下是zip
的定义方式:
(define (zip . lsts)
(apply map list lsts))