是否有任何函数来索引集合上的计算结果?



如果之前已经回答过这个问题,我们深表歉意。我想出的搜索词并不是很具体......

我已经在 utils 命名空间中定义了以下函数,但它看起来很愚蠢,并且可能在其他地方定义:

(defn index-with
"returns a map of x -> (f x) for every x in xs"
[f xs]
(apply hash-map (mapcat #(vector % (f %)) xs)))

下面是它的用法示例:

(index-with count ["a" "bb" "ccc" "ddd"])
=> {"a" 1, "bb" 2, "ccc" 3, "ddd" 3}

如果要反转键和值的角色(可能不明确(,则会得到类似于group-by的输出:

(group-by count ["a" "bb" "ccc" "ddd"])
=> {1: ["a"], 2: ["bb"], 3: ["ccc", "ddd"]}

我也看了clojure.set/index但它似乎只涵盖了一个特定的场景(这里不适用(。

Clojure 核心库中已经存在这样的东西吗?

似乎clojure.core/zipmap相当接近我正在寻找的内容:

(def xs ["a" "bb" "ccc" "ddd"])
(zipmap xs (map count xs))
=> {"a" 1, "bb" 2, "ccc" 3, "ddd" 3}

您已经提出了两个单行实现。 第三个可能是:

(into {} (map (juxt identity count)) xs)

所有三种解决方案似乎都假定xs输入的唯一性。 如果你有一个单独的函数,那么我希望它应该以合理的方式处理碰撞。

如果你想积累一个纯函数的旁路表,那么你想要的函数是memoize

函数的记忆版本保留映射的缓存 结果的论据...

最新更新