2016-11-29 52 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)在這些情況下很有用。