如何"解嵌"一些嵌套列表

ipe*_*tta 1 common-lisp racket

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

'((()) (((((a c d f e d))))) (((((a c d e f d))))))
Run Code Online (Sandbox Code Playgroud)

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

'((a c d f e d) (a c d e f d))
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

Ale*_*ing 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)
Run Code Online (Sandbox Code Playgroud)

但是,看起来您想要展平每个子列表,在这种情况下,您只想使用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))
Run Code Online (Sandbox Code Playgroud)

但是,这仍然留下第一个空列表,在您的问题中,它看起来像您要删除.在这种情况下,我只需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))
Run Code Online (Sandbox Code Playgroud)

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

(define (flatten-non-empty-sublists lst)
  (filter (negate empty?) (map flatten lst)))
Run Code Online (Sandbox Code Playgroud)