旋转列表列表

时间:2014-04-20 01:18:14

标签: list racket

我想采用任意列表并“旋转”它。也就是说,对于大小为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,但我无法找到最简洁的方法来做到这一点。

知道必须有一种优雅的方式来做到这一点。我在过去对这个问题做了一些不太优雅的解决方案,这些解决方案更具针对性,但是我想在一般情况下解决这个问题,将其存放在个人库中,然后解决问题。任何提示或解决方案?

1 个答案:

答案 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))