是否有任何函数可以对集合上的计算结果进行索引?

时间:2017-07-15 15:11:34

标签: clojure

如果之前已经回答过,那真的道歉。我想出的这个搜索词并不是特定的......

我在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 core-lib中是否存在类似的内容?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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

xs输入中的所有三个解决方案似乎都具有唯一性。如果你有一个单独的功能,那么我认为它应该以合理的方式处理碰撞。

答案 2 :(得分:0)

如果您希望累积纯函数的后备表,那么您想要的函数是memoize

  

该函数的memoized版本保留了映射的缓存   结果的论据......