filter on sets ... [reward: me face palming]

69 views
Skip to first unread message

Mond Ray

unread,
May 25, 2013, 7:21:22 AM5/25/13
to clo...@googlegroups.com
I am missing something obvious... I get a list of maps back from a function and I want to find the elements with nil

(({:a2p-id "1", :dh-uuid "abc-def-ghi-klm"} {:a2p-id "2", :dh-uuid "def-ghi-klm-opq"} {:a2p-id "3", :dh-uuid nil}) ({:a2p-id "1", :dh-uuid "abc-def-ghi-klm"} {:a2p-id "2", :dh-uuid "def-ghi-klm-opq"} {:a2p-id "3", :dh-uuid nil}))

I try the select function but it has no effect ... same list

(set/select #(not (:dh-uuid %)) (map find-records query-parts))

also tried the previously working example... same list

(filter #(not (:dh-uuid %)) (map find-records query-parts))

I am assuming that I am not indexing into each of the maps but I cannot remember or find out how to do this ... all examples only show one map

Thanks

Ray

atkaaz

unread,
May 25, 2013, 7:25:03 AM5/25/13
to clo...@googlegroups.com
without giving this much thought is the % actualy a vector like [:dh-uuid "abc-def-ghi-klm"] ?


--
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to
clojure+u...@googlegroups.com
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 unsubscribe from this group and stop receiving emails from it, send an email to clojure+u...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

atkaaz

unread,
May 25, 2013, 7:27:45 AM5/25/13
to clo...@googlegroups.com
can you tell what this returns?
(map find-records query-parts)


On Sat, May 25, 2013 at 2:21 PM, Mond Ray <mondr...@gmail.com> wrote:
--

sdegutis

unread,
May 25, 2013, 7:41:33 AM5/25/13
to clo...@googlegroups.com
(def some-list
  [{:a2p-id "1", :dh-uuid "abc-def-ghi-klm"}
   {:a2p-id "2", :dh-uuid "def-ghi-klm-opq"}
   {:a2p-id "3", :dh-uuid nil}])

If you want to filter out only nil: (filter (comp (complement nil?) :dh-uuid) some-list)
If you want to filter out nil or false: (filter (comp identity :dh-uuid) some-list)

-Steven

Cedric Greevey

unread,
May 25, 2013, 8:10:07 AM5/25/13
to clo...@googlegroups.com
Why not just (filter (complement :dh-uuid) seq-of-maps)? Or (remove :dh-uuid seq-of-maps) even?


--

Steven Degutis

unread,
May 25, 2013, 8:13:09 AM5/25/13
to clo...@googlegroups.com
Cedric's answer is best: either (filter :dh-uuid some-list) or (remove :dh-uuid some-list) depending on which list you want.


You received this message because you are subscribed to a topic in the Google Groups "Clojure" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/clojure/0TfUVMsfcD8/unsubscribe?hl=en.
To unsubscribe from this group and all its topics, send an email to clojure+u...@googlegroups.com.

Andy Fingerhut

unread,
May 25, 2013, 1:27:45 PM5/25/13
to clo...@googlegroups.com
If (map find-records query-parts) is returning this expression:


(({:a2p-id "1", :dh-uuid "abc-def-ghi-klm"} {:a2p-id "2", :dh-uuid "def-ghi-klm-opq"} {:a2p-id "3", :dh-uuid nil}) ({:a2p-id "1", :dh-uuid "abc-def-ghi-klm"} {:a2p-id "2", :dh-uuid "def-ghi-klm-opq"} {:a2p-id "3", :dh-uuid nil}))

then especially note the double parentheses.  That is a list (or sequence), whose first element is a list (or sequence) of maps.  You can use (first (map find-records query-parts)) to get the inner list.

Andy


--

Andy Fingerhut

unread,
May 25, 2013, 1:29:55 PM5/25/13
to clo...@googlegroups.com
Woops, and here I wasn't being careful enough...  You have a list (or sequence) of two elements, both of which are lists (or sequences) of maps.  You can use (apply concat (map find-records query-parts)) to return a single list containing nothing but maps.

Andy

Mond Ray

unread,
May 25, 2013, 2:09:05 PM5/25/13
to clo...@googlegroups.com
Bingo:

user=> (filter (complement :dh-uuid) (apply concat (map find-records query-parts)))
({:a2p-id "3", :dh-uuid nil} {:a2p-id "3", :dh-uuid nil})

Thanks everyone!

Steven Degutis

unread,
May 25, 2013, 2:15:19 PM5/25/13
to clo...@googlegroups.com
Wouldn't (remove :dh-uuid (apply concat (map find-records query-parts))) be better?


You received this message because you are subscribed to a topic in the Google Groups "Clojure" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/clojure/0TfUVMsfcD8/unsubscribe?hl=en.
To unsubscribe from this group and all its topics, send an email to clojure+u...@googlegroups.com.

Mond Ray

unread,
May 25, 2013, 2:29:47 PM5/25/13
to clo...@googlegroups.com
On the other hand ... does that mean that the sequence being filtered is not lazy?

Mond Ray

unread,
May 25, 2013, 2:32:14 PM5/25/13
to clo...@googlegroups.com
It's as I presented it - a list of a list of maps

Mond Ray

unread,
May 25, 2013, 2:38:06 PM5/25/13
to clo...@googlegroups.com
This is my latest working invocation:

(doall (map #(remove :dh-uuid %) (map find-records query-parts)))
(({:a2p-id "3", :dh-uuid nil}) ({:a2p-id "3", :dh-uuid nil}))

The list of maps is retained which might be useful later.

Thanks

atkaaz

unread,
May 25, 2013, 3:01:31 PM5/25/13
to clo...@googlegroups.com
=> (doall (map #(remove :dh-uuid %)
            '(({:a2p-id "1", :dh-uuid "abc-def-ghi-klm"} {:a2p-id "2", :dh-uuid "def-ghi-klm-opq"} {:a2p-id "3", :dh-uuid nil}) ({:a2p-id "1", :dh-uuid "abc-def-ghi-klm"} {:a2p-id "2", :dh-uuid "def-ghi-klm-opq"} {:a2p-id "3", :dh-uuid false}))
            ))
(({:a2p-id "3", :dh-uuid nil}) ({:a2p-id "3", :dh-uuid false}))

idiomatic clojure ftw :)

Mond Ray

unread,
May 25, 2013, 3:40:50 PM5/25/13
to clo...@googlegroups.com
Thanks for the demo ... the next part of my code will decide if the key is in an atom feed so I will be testing for false in the results too - FTW indeed :D
Reply all
Reply to author
Forward
0 new messages