如何在clojure中部分展平列表?

时间:2013-04-18 16:29:50

标签: clojure

假设我有一个类似的数据结构:

[[1 2 3] [4 5 6] [[7 8 9] [10 11 12]]]

我最终想要的是:

[[1 2 3] [4 5 6] [7 8 9] [10 11 12]]

是否有任何功能可以自动执行此操作?

基本上我正在将SQL结果集转换/转换为CSV,并且有些行将转换为CSV中的2行。所以我的map函数在正常情况下返回一个向量,但有时会返回向量向量。 Clojure.data.csv只需要一个向量列表,所以我需要展平已经转动的行。

3 个答案:

答案 0 :(得分:2)

Mapcat对于映射,每个元素可以扩展为0个或更多输出元素,如下所示:

(mapcat #(if (vector? (first %)) % [%]) data)

虽然我不确定(vector? (first %))是否足以对您的数据进行测试。

答案 1 :(得分:0)

使用tree-seq的另一种方法:

(def a [[1 2 3] [4 5 6] [[7 8 9] [10 11 12]]])

(filter (comp not vector? first) 
   (tree-seq (comp vector? first) seq a))

我在这里使用tree-seq。有经验的人会不会评论是否有更好的方法只返回孩子,而不是使用有效的过滤器(不是分支?)

答案 2 :(得分:0)

Clojure: Semi-Flattening a nested Sequence回答了您的问题,但我不想将此问题标记为该问题的副本,因为您确实提出了与他不同的问题;我想知道是否有可能将他的答案移到这里。