2016-11-29 54 views
1

我有一个返回的结果看起来像这样的功能:如何在clojure中拼合嵌套列表?

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

有一个简单/成语/高效的扁平化上面所列内容到一个列表方式:

({:one 1} {:two 2} {:three 3} {:four 4}) 
  • 有没有办法将不确定数量的嵌套列表项目变成单个列表?如果它可以处理不同级别的嵌套,那将会很好。
  • 或只是一个map类似的功能,忽略列表级别嵌套,并在叶子上操作?
  • 也许我应该做一些不同的功能级别来构建数据? (例如,reduce代替map
+2

你是否检查'flatten'功能? –

+0

完美,'(flatten'(({:1 1})({:two 2}({:three 3} {:four 4}))))'outputs'({:one 1} {:two 2} {:three 3} {:four 4})' –

+0

我应该删除这个问题吗? –

回答

9

虽然可以使用flatten要修正损坏的嵌套(在大多数情况下,无论如何,这取决于你的数据的形状等),它几乎总是更好地建设名单适当地开始。试着问另一个关于如何避免产生这个愚蠢列表的问题。

+0

我把这个问题标记为“正确建立列表几乎总是比较好”。 –

1

有没有办法将不确定数量的嵌套列表项目变成单个列表?

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

或只是一个map类似的功能,忽略列表级别嵌套,并在叶子上操作?

我不认为有一个由Clojure的提供,但你总是composemapflatten

(comp map flatten) 

也许我应该做不同的东西在函数级别上构建数据?

由于您没有提供关于如何构建数据的任何细节,所以我们不可能说这种或那种方式。但是,这是大概一个好主意。

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