球拍:遍历两个大小不同的列表

时间:2020-09-13 01:16:39

标签: scheme racket

我有两个列表

(a b c d)

是一组(唯一元素列表)和

((a 2) (a 1) (b 3) (c 1) (c 4) (c 2) (c 5) (d 3)

现在,我想要一个包含第一个列表中所有元素的列表,像这样。

((a 2 1 3) (b 3) (c 1 4 2 5) (d 3))

我使用两个for循环(for ((ele1 lst1)) ...)(for ((ele2 lst2)) ...)实现了上述目标,但对我的解决方案不满意。我也看过group-by很简单,但这并不是我想要的。

我认为,有一个更好而优雅的功能解决方案。我对吗?有人可以告诉我吗?

谢谢。

编辑

我正在使用Racket。 这是我实现该目标的迭代代码。

(define (student-log log)
   (for ((n unique-names))
      (let ((l (list n)))
         (for ((i data))
            (cond ((equal? n (car i))
               (set! l (append l (list (cadddr i)))))))
      (set! log (append log (list l))))) log)
   

我正在使用局部变量l,并使用set!重设llog的值。它看起来更像是过程性,而不是功能性

1 个答案:

答案 0 :(得分:1)

感谢@Sorawee Porncharoenwase

(define (group-by-my-rule mix-ls)
  (map (λ (ls) (cons (first (first ls)) (map second ls)))
         (group-by first mix-ls)))

(group-by-my-rule '((a 1) (a 2) (a 3) (b 1) (e 2) (c 2) (c 3) (c 4) (d 1) (e 1) (c 1)))