从列表中的每个对返回第二个元素,第一个元素在另一个列表中

时间:2013-11-13 20:29:58

标签: list scheme element

我有一份表格1((1(8 3))(2(4 5 7))(3(6 7)))

我也有一个表格2(2 3)

我想要一个列表,其中包含list1中每一对中的所有第二个元素,其中第一个元素位于list2中。

在我们的案例中,结果将是(4 5 7 6 7)

我在想这样的事情,但我完全糊涂了!

  (define (returnlist l1 l2)
  (

   cond(( equal? (map car l1)) (car l2)) (  cdr(car l1)))
         (else  (returnlist  l1 (cdr l2)    )
   )


    ))

2 个答案:

答案 0 :(得分:0)

此解决方案有几个步骤:

  1. 过滤其密钥属于list2的元素(对此使用filter
  2. 获取与每个键对应的列表(map将有用)
  3. 使用答案创建一个列表(apply + append将保存当天)
  4. 这就是我的意思:

    (define (returnlist l1 l2)
      (apply append                   ; step 3
             (map cadr                ; step 2
                  (filter (lambda (e) ; step 1
                            (member (car e) l2))
                          l1))))
    

    结果将符合预期:

    (define list1 '((1 (8 3)) (2(4 5 7)) (3 (6 7))))
    (define list2 '(2 3))
    (returnlist list1 list2)
    => '(4 5 7 6 7)
    

答案 1 :(得分:0)

这是一个递归版本:

(define (returnlist l1 l2)
  (if (empty? l1)
      '()
      (let* ((c (car l1)) (c1 (car c)))
        (if (member c1 l2)
            (append (cadr c) (returnlist (cdr l1) l2))
            (returnlist (cdr l1) l2)))))

然后

(returnlist '((1 (8 3)) (2 (4 5 7)) (3 (6 7))) '(2 3))
=> '(4 5 7 6 7)