使用每个地图中的键值将地图序列转换为地图地图

时间:2016-02-29 02:36:24

标签: clojure

我有一个如下所示的序列:({:a 1 :b "lorem"} {:a 2 :b "ipsum"})我希望使用:a的值将其转换为地图的地图,作为新地图中键的值。我期待的结果是{:1 {:a 1 :b "lorem"} :2 {:a 2 :b "ipsum"}}

也许这不是惯用语,我还在学习。我基本上收到一个很大的序列,我将在每个地图中按照某个值查找此序列中的值,并且我想使用地图将其设为O(1)。

在C#中,在IEnumerable上,您可以使用.ToDictionary(x => x.SomeProperty)的值作为键来调用SomeProperty,它将返回键值对的词典。并且这具有O(1)的查找性能,而不是列表/序列的典型O(N)。

1 个答案:

答案 0 :(得分:3)

这应该做你想要的变换:

(def latin '({:a 1 :b "lorem"} {:a 2 :b "ipsum"}))

(defn transform [kw in]
  (zipmap (map kw in) in))

=> (transform :a latin)
{1 {:a 1, :b "lorem"}, 2 {:a 2, :b "ipsum"}}

我在将数字更改为关键字时犹豫不决,因为不确定你想要这样做的原因......

... 编辑 - 因为你总是可以像这样进行索引(O(1))检索:

(get (transform :a latin) 1)

1不会在前面工作,因为它不能用作函数(与:1不同),但是get是第二个参数的函数是第一个参数是地图时的搜索键。