球拍:使用两种条件进行过滤(将列转换为列表)

时间:2015-04-05 20:19:31

标签: list matrix filter racket abstraction

我试图从类似矩阵的列表列表中创建一个包含列的所有值的列表。 该列表应仅包含数字和

的猜测数
(define-struct guess (symbol number))

puzzle1:

 (list
    (list 'a 'b 'b 'c)
    (list 'a 2 1 4)
    (list 'f 3 'g 'g)
    (list 'f 'h 'i 'i))

参数是矩阵和位置,所以:

(check-expect (used-in-column puzzle1 (make-posn 0 1)) (list 2 3))

(define-struct puzzle (size board constraints))

其中棋盘部分是上面需要的puzzle1示例

我可以创建一个只包含数字的列表,但似乎无法改变代码,因此它会将任何猜测数添加到列表中

所以这里有一个内部猜测的例子,我的代码给出的输出是空的

(check-expect (used-in-column puzzle1partial2 (make-posn 0 1)) (list 2))

拼图板的位置

(list
    (list (make-guess 'a 2) 'b 'b 'c)
    (list 'a 2 1 4)
    (list 'f 3 'g 'g)
    (list 'f 'h 'i 'i))

到目前为止,我的代码看起来像这样:

(define (used-in-column puz pos)
  (local [(define (columns board pos)
            (cond
              [(empty? board) empty]
              [else (cons  (list-ref (first board) (posn-x pos))
                           (columns (rest board) pos))]))]
    (cond    
      [(empty? puz) empty?]
      [else (quicksort (filter number? (columns (puzzle-board puz) pos)) <)])))

我尝试使用if语句和其他变体,但它最终使我的代码变得一团糟而且没有给我任何结果。

有人可以给我任何建议吗?

1 个答案:

答案 0 :(得分:2)

至于您的主题,您可以使用标准unzip

进行转置
(define (unzip lsts)
  (apply map list lsts))

(unzip '((1 2) (a b))) ; ==> ((1 a) (2 b))

如果您只想要一行,请使用list-ref:

(map (lambda (x) (list-ref x 1)) '((1 2) (a b))) ; ==> (2 b)

我真的不明白你的代码应该做什么,我也不能运行它(我认为缺乏一个结果)所以我就把它留在这里。