我有以下地圖。並給出一個性別的參數,需要爲那個性別沒有最多錢的用戶。怎麼做?clojure:如何從地圖中選取具有最高價值的物品
{:user1 {:money 400 :sex :male}
:user2 {:money 300 :sex :female}
:user3 {:money 200 :sex :male}
}
我有以下地圖。並給出一個性別的參數,需要爲那個性別沒有最多錢的用戶。怎麼做?clojure:如何從地圖中選取具有最高價值的物品
{:user1 {:money 400 :sex :male}
:user2 {:money 300 :sex :female}
:user3 {:money 200 :sex :male}
}
這裏,你可以把它寫一個方法(感謝@Lee使用max-key
的想法!):
(defn richest [sex users]
(apply max-key (comp :money val) (filter (comp #{sex} :sex val) users)))
所以,你首先過濾掉所有不符合標準的用戶。對於users
中的每個條目,您將獲得該條目的val
,然後在該條目下獲得:sex
的值,然後檢查該結果是否包含在包含sex
的單元素集中。
然後,一旦你篩選掉了你不想要的用戶,就可以查看結果序列的條目。對於每個條目,您再次獲得該條目的val
,然後在該條目下得到:money
的值,最後返回給出該查詢的最高結果的條目。
例子:
(def users {:user1 {:money 400 :sex :male}
:user2 {:money 300 :sex :female}
:user3 {:money 200 :sex :male}})
(richest :male users)
;=> [:user1 {:money 400, :sex :male}]
(richest :female users)
;=> [:user2 {:money 300, :sex :female}]
您可以使用max-key
:
(defn richest-by-sex [users s]
(apply max-key (comp :money second) (filter (fn [[n v]] (= s (:sex v))) users)))
https://clojuredocs.org/clojure.core/reduce –
你需要讓用戶無需* *最多的錢對於一個給定的性別,或與* *最賺錢對於給定的性別? –