如何“解嵌”一些嵌套列表

时间:2016-08-14 00:25:30

标签: common-lisp racket

我有一个递归函数给我这个答案:

'((()) (((((a c d f e d))))) (((((a c d e f d))))))

除了我需要查看函数以便清理它之外,这引出了一个问题:如何清理这个答案?如何“解嵌”这些列表以便返回:

'((a c d f e d) (a c d e f d))

我需要在Racket或Common Lisp中使用一些策略或适当的功能。

提前致谢!

2 个答案:

答案 0 :(得分:5)

您想要的行为有点不清楚 - 如果您只是想要压缩列表,在Racket中,您只需使用flatten函数:

> (flatten '((()) (((((a c d f e d))))) (((((a c d e f d)))))))
'(a c d f e d a c d e f d)

但是,您似乎想要展平每个子列表,在这种情况下,您只想使用与map配对的flatten

> (map flatten '((()) (((((a c d f e d))))) (((((a c d e f d)))))))
'(() (a c d f e d) (a c d e f d))

然而,这仍然留下第一个空列表,在您的问题中,它看起来像您要删除。在这种情况下,我只需在展平后添加一个filter步骤:

> (filter (negate empty?) (map flatten '((()) (((((a c d f e d))))) (((((a c d e f d))))))))
'((a c d f e d) (a c d e f d))

你可以将它包装成一个具有你想要的行为的简单函数:

(define (flatten-non-empty-sublists lst)
  (filter (negate empty?) (map flatten lst)))

答案 1 :(得分:3)

在常见的lisp中,您可以从alexandria获取flatten函数,您可以从quicklisp获取该函数。