Kevin
Kevin

Reputation: 25269

how to paritally flatten a list in clojure?

Let's say I have a data structure like so:

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

And what I want to end up with is:

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

Is there any function that does this automatically?

Basically I'm converting/transforming a SQL result set to CSV, and there are some rows that will transform to 2 rows in the CSV. So my map function in the normal case returns a vector, but sometimes returns a vector of vectors. Clojure.data.csv needs a list of vectors only, so I need to flatten out the rows that got pivoted.

Upvotes: 3

Views: 437

Answers (3)

amalloy
amalloy

Reputation: 92117

Clojure: Semi-Flattening a nested Sequence answers your question, but I don't want to mark this question as a duplicate of that one, since you're really asking a different question than he was; I wonder if it's possible to move his answer over here.

Upvotes: 0

Alex Stoddard
Alex Stoddard

Reputation: 8344

A different approach using 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))

I am stretching to use tree-seq here. Would someone with more experience care to comment on if there is a better way to return only the children other than using what is effectively a filter of (not branch?)

Upvotes: 0

Joost Diepenmaat
Joost Diepenmaat

Reputation: 17771

Mapcat is useful for mapping where each element can expand into 0 or more output elements, like this:

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

Though I'm not sure if (vector? (first %)) is a sufficient test for your data.

Upvotes: 2

Related Questions