繁体   English   中英

clojure等效于python defaultdict

[英]clojure equivalent of python defaultdict

假设我们有一些函数f返回一个可以用作字典键的值:

d = defaultdict(set)

for x in xs:
    d[f(x)].add(x)

该结构可能看起来像这样,但是我不知道如何a)提供默认值和b)与现有值合并

(defn build-maps [xs]
  (let [inverse-map {}]
    (reduce (fn [im x]
              (let [y (f x)
                    im' (assoc im y x)] ; want to add x to a set
                im')) inverse-map xs)))

更新 ,以下似乎工作

(defn build-maps [xs]
  (let [inverse-map {}]
    (reduce (fn [im x]
              (let [y (f x)
                    new-im (assoc im y (set/union (im y) #{x}))]
                new-im)) inverse-map xs)))

我写这个的方式是:

(apply merge-with into
       (for [x xs]
         {(f x) #{x}}))

但是,如果您想要更接近于基于缩减的计划,则可以编写:

(reduce (fn [m x]
          (update m (f x) (fnil conj #{}) x))
        {}, xs)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM