Or if you want something that is agnostic about the structure of your input
map, try this:
(defn alter-map
[in-map]
(map (partial reduce merge)
(partition
(count (keys in-map))
(apply interleave
(map (fn [p]
(map #(hash-map (first p) %)
(seq (.split (fnext p) "\\s"))))
in-map)))))
; Usage:
(def data '( {:animal "dog cat bird" :sound "woof meow chirp"
:number-of-feet "4 4 2"}
{:animal "horse" :sound "neeeee" :number-of-feet "4"}
{:animal "wolf pig" :sound "howl oink":number-of-feet "4
4"}))
(pprint (map alter-map data))
;(({:number-of-feet "4", :sound "woof", :animal "dog"}
; {:number-of-feet "4", :sound "meow", :animal "cat"}
; {:number-of-feet "2", :sound "chirp", :animal "bird"})
; ({:number-of-feet "4", :sound "neeeee", :animal "horse"})
; ({:number-of-feet "4", :sound "howl", :animal "wolf"}
; {:number-of-feet "4", :sound "oink", :animal "pig"}))
Of course, there's probably a better way to write that.
-Brendan
On Fri, Mar 5, 2010 at 4:36 PM, Tayssir John Gabbour <[email protected]>wrote:
> Hi Base,
>
> Perhaps something like the following:
>
> (defn normalize-creatures [creatures]
> (letfn [(split [str] (seq (.split str "\\s")))]
> (for [{:keys [animal sound number-of-feet]} creatures]
> (map (fn [a s n]
> {:animal a :sound s :number-of-feet n})
> (split animal) (split sound) (split number-of-feet)))))
>
>
> ;; *foo* is the test data you mentioned
> (normalize-creatures *foo*)
> => (({:animal "dog" :sound "woof" :number-of-feet "4"}
> {:animal "cat" :sound "meow" :number-of-feet "4"}
> {:animal "bird" :sound "chirp" :number-of-feet "2"})
> ({:animal "horse" :sound "neeeee" :number-of-feet "4"})
> ({:animal "wolf" :sound "howl" :number-of-feet "4"}
> {:animal "pig" :sound "oink" :number-of-feet "4"}))
>
>
> All the best,
> Tayssir
>
>
>
>
> On Mar 6, 1:07 am, Base <[email protected]> wrote:
> > Hi all -
> >
> > I am trying to transofrm a data structure and am kind of stuck.
> >
> > I currently have a list of maps
> >
> > ( {:animal "dog cat bird" :sound "woof meow chirp" :number-of-feet "4
> > 4 2"}
> > {:animal "horse" :sound "neeeee" :number-of-feet "4"}
> > {:animal "wolf pig" :sound "howl oink":number-of-feet "4 4"} )
> >
> > and want to trasform it to:
> >
> > (
> > ({:animal "dog" :sound "woof" :number-of-feet "4" }
> > {:animal "cat" :sound "meow" :number-of-feet "4"}
> > {:animal "bird" :sound "chirp" :number-of-feet "2"})
> >
> > ({:animal "horse":sound "neeee" :number-of-feet "4"})
> >
> > ({:animal "wolf" :sound "howl" :number-of-feet "4"}
> > {:animal "pig" :sound "oink" :number-of-feet "4"})
> > )
> >
> > *spacing added for clarity*
> >
> > I have tried a few goofy attempts at this that were somewhat
> > successful. but what I don't like is that most of my attempts (which i
> > am kind of embarrassed to post) end up looking very un-clojuresque,
> > and much more imperative looking...and we all know there is a better,
> > more idiomatic way...
> >
> > any help is (as always) most appreciated.
> >
> > thanks
> >
> > base
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to [email protected]
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> [email protected]<clojure%[email protected]>
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
>
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en