如果之前已经回答过,那真的道歉。我想出的这个搜索词并不是特定的......
我在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中是否存在类似的内容?
答案 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版本保留了映射的缓存 结果的论据......