首页 > 解决方案 > 从两个不同大小的列表创建对列表

问题描述

对于 Scheme 来说还是新手,我目前在创建由两个不同长度的单独列表构成的对列表时遇到了麻烦。

这是我当前的代码:

#lang racket
    
(define letters '(a b c))

(define (create-lst-letters lst)
  (map (lambda (x y) (list x y)) letters lst))

控制台输入:

(create-lst-letters '(1 2 3 4 5 6 7 8))

电流输出:

map: all lists must have same size
     first list length: 8
     other list length: 3

想要的输出:

'((a . 1) (b . 2) (c . 3) (a . 4) (b . 5) (c . 6) (a . 7) (b . 8))

另一个直觉是得到输入列表长度除以“字母”的商和余数。通过附加“字母”商时间创建一个新列表,然后连接“字母”元素的第一个余数。使用该新列表执行上述地图。我不觉得这是一个好的做法,也不是一个优雅的解决方案,但我没有其他想法。

标签: listfunctional-programmingschemeracket

解决方案


您可以使用in-cycleandfor/list来简洁地生成您想要的输出。

#lang racket
    
(define letters '(a b c))

(define (create-lst-letters lst)
  (for/list ([x (in-cycle letters)] [y lst])
    (cons x y)))

(create-lst-letters '(1 2 3 4 5 6 7 8))
; '((a . 1) (b . 2) (c . 3) (a . 4) (b . 5) (c . 6) (a . 7) (b . 8))

推荐阅读