给出索引列表重新排列列表

时间:2016-02-17 00:14:44

标签: scheme lisp

(rearrange-this '(4 (4 2) 1) '(a b c d)) -> (d (d b) a)

所以我需要这个来进入子列表并重新排列。

(define (rearrange-this list1 list2) ;Initial function 
(rearrange-r list1 list2 (count list1) '() list1))

;list 1 holds numbers, list2 hold letters 

(rearrange-this '(4 3 2 1) '( a b c d )) ;-> outputs (d c b a)
(rearrange-this '(2 3 4 1 3 2 1 4) '(a b c d)) ;-> outputs (b c d a c b a d)

1 个答案:

答案 0 :(得分:2)

您希望尽可能使用更高阶的函数。列表操作最重要的是:mapfoldfilterlist-tabulate。学习这些将节省很多时间。

在这种情况下,

map非常有用。我用它来编写一个deep-map函数,该函数深入研究子列表并对其中的对象应用操作,但如果你想将列表映射到其他东西,它将不起作用,因为deep-map将深入研究这些列表。您必须将这些列表包装在某些内容中,以使list?检查失败。

编写深度图后,我将其与list-ref一起使用,从value-list中选择适当的元素,并替换arrangement中的数字。

(define (deep-map operator deep-list)
    (map
        (lambda (element)
            (if (list? element)
                (deep-map operator element)
                (operator element)))
        deep-list))

(define (rearrange-this arrangement value-list)
    (deep-map
        (lambda (element)
            (list-ref value-list element))
        arrangement))

这是对代码的快速测试。请注意,与您的代码不同,列表位置从0开始。如果您希望从1开始输入引用,则可以map输入排列列表。我将把它作为练习留给您。

> (rearrange-this '(3 2 (1 0)) '(a b c d))
;Value 16: (d c (b a))