我有一个如下所示的序列:({: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)。
答案 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
是第二个参数的函数是第一个参数是地图时的搜索键。