【问题标题】:Return the second element from every pair in list which the first element is in another list从列表中的每对中返回第二个元素,其中第一个元素在另一个列表中
【发布时间】:2013-11-26 15:21:43
【问题描述】:

我有一个列表 1,格式为 ( (1 (8 3)) ( 2(4 5 7)) ( 3 ( 6 7)))

而且我还有一个 list2 形式 (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)    )
   )


    ))

【问题讨论】:

    标签: list scheme element


    【解决方案1】:

    这个解决方案有几个步骤:

    1. 过滤其键属于list2的元素(为此使用filter
    2. 获取每个key对应的列表(map会有用)
    3. 创建一个包含答案的列表(apply + append 将节省时间)

    这就是我的意思:

    (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)
    

    【讨论】:

      【解决方案2】:

      这是一个递归版本:

      (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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多