【问题标题】:Get one list of lists from N lists of lists, and sometimes a list also从 N 个列表中获取一个列表,有时也获取一个列表
【发布时间】:2019-08-01 23:57:05
【问题描述】:

我还在学习 Scheme。

如果有这两个列表:

'((1 2 (3 4) 5) (12 13 4))
'((3 4 9) (7 6 5 4))

我想得到这个列表:

'((1 2 (3 4) 5) (12 13 4) (3 4 9) (7 6 5 4))

但是cons:

(cons '((1 2 (3 4) 5) (12 13 4)) '((3 4 9) (7 6 5 4)))

我得到了这份清单:

'(((1 2 (3 4) 5) (12 13 4)) (3 4 9) (7 6 5 4))

注意

在此示例中,两个列表都有两个子列表。但它们可以有 n 个子列表。

我已尝试使用append,但当列表列表之一只是一个列表时它不起作用:

(append '(1 2 3 4) '((23 24 25 26) (a b c)))
> '(1 2 3 4 (23 24 25 26) (a b c))

是否有一个功能可以做到,或者我必须实现它?

【问题讨论】:

  • 当列表中的一个列表只是一个列表时,“append 不起作用”是什么意思? append 的行为不依赖于列表的元素。 (append '((1 2 (3 4) 5) (12 13 4)) '((3 4 9) (7 6 5 4))) 产生预期的 '((1 2 (3 4) 5) (12 13 4) (3 4 9) (7 6 5 4))
  • 看那段下面的代码。
  • @VansFannel 如果你不喜欢'(1 2 3 4 (23 24 25 26) (a b c)),那么你应该定义你想要的。
  • Using car and cdr的可能重复

标签: functional-programming scheme


【解决方案1】:

您想要的行为非常具体,您不会在标准库中找到它。好消息是,假设输入列表不为空,那么它很容易以一种可移植且高效的方式实现,涵盖所有可能的情况:

(define (my-append lst1 lst2)
  (cond ((and (pair? (car lst1)) (pair? (car lst2)))
         (append lst1 lst2))
        ((pair? (car lst1))
         (append lst1 (list lst2)))
        ((pair? (car lst2))
         (append (list lst1) lst2))
        (else
         (append (list lst1) (list lst2)))))

例如:

(my-append '((1 2 (3 4) 5) (12 13 4)) '((3 4 9) (7 6 5 4)))
=> '((1 2 (3 4) 5) (12 13 4) (3 4 9) (7 6 5 4))

(my-append '(1 2 3 4) '((23 24 25 26) (a b c)))
=> '((1 2 3 4) (23 24 25 26) (a b c))

【讨论】:

  • (my-append '((1 2) 3 4) '((23 24 25 26) (a b c))) 怎么样?只是猜测,但由于 ((1 2) 3 4) 不符合列表列表的条件,OP 可能想要获得 (((1 2) 3 4) (23 24 25 26) (a b c)) 而不是 ((1 2) 3 4 (23 24 25 26) (a b c))
  • 好吧,那么 OP 应该真的,真的发布一组他想要什么的很好的测试,不要让人们每次都猜测他需要什么复杂的功能;)
  • 是的,OP很烦人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 2011-10-13
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
相关资源
最近更新 更多