如何在clojure中展平嵌套列表?

时间:2016-11-29 21:18:25

标签: clojure

我有一个返回看起来像这样的结果的函数:

(({:one 1}) ({:two 2} ({:three 3} {:four 4})))

是否有一种简单/惯用/有效的方法将上面的列表展平为一个列表:

({:one 1} {:two 2} {:three 3} {:four 4})
  • 有没有办法将不确定数量的嵌套列表项转换为单个列表?如果它能够处理不同级别的嵌套,那将是很好的。
  • 或者只是一个忽略列表级嵌套的map - 类函数,并在叶子上运行?
  • 也许我应该在功能级别做一些不同的事情来构建数据? (例如,reduce代替map

2 个答案:

答案 0 :(得分:10)

虽然您可以使用flatten来修复损坏的嵌套(在大多数情况下,无论如何,取决于您的数据形状如何),最好始终正确构建列表。尝试询问另一个关于如何避免生成这个愚蠢的列表的问题。

答案 1 :(得分:1)

  

有没有办法将不确定数量的嵌套列表项转换为单个列表?

flatten采用嵌套序列并返回包含“叶子”的单个扁平序列(即非连续项)。

  

或者只是一个忽略列表级嵌套的map类函数,并在叶子上运行?

我不认为Clojure提供了一个,但你总是可以compose mapflatten

(comp map flatten)
  

也许我应该在功能级别做一些不同的事情来构建数据?

由于您没有提供有关如何构建数据的任何详细信息,因此我们无法以这种或那种方式说出来。但是,这可能是一个好主意。

同样,你不可能给你任何好的建议。但我通常会发现mapcat(或只是concat)在这些情况下很有用。