2010-12-01 77 views

回答

47
user=> (into {} [[:a 1] [:b 2]]) 
{:a 1, :b 2} 
5

假设 “三元组” 是指 “双elememt阵列”:

(reduce 
    (fn [m tupel] 
     (assoc m 
      (aget tupel 0) 
      (aget tupel 1))) 
    {} 
    array-of-tupels)
+0

不错。如果你的(对于OP)“数组”实际上是一个seq,而不是`(age t n)`,你可以使用`(t n)`,这有点漂亮。 – Isaac 2010-12-01 20:49:10

+0

`(t n)`不适用于序列。它与矢量。但是,你可以简单地使用`(进入{}向量数组')而不是`reduce'。 – kotarak 2010-12-02 14:12:42

4
user=> (def a [[:a 4] [:b 6]]) 
user=> (apply hash-map (flatten a)) 
{:a 4, :b 6} 
+2

`flatten`对于这个问题是矫枉过正的。您可以利用以MapEntry(键和值的向量)形式存在的元组。 – miner49r 2011-04-22 19:12:08

+1

永远不要使用`flatten`来处理这样的情况:如果它们碰巧是数据结构,它将会愉快地平滑所有的键和值。 – 2016-07-07 20:36:15

5

地图是MapEntry元素的序列。每个MapEntry都是一个键和值的向量。问题中的元组已经以MapEntry的形式出现,这使得方便。 (这也是为什么into解决方案是好的。)

user=> (reduce conj {} [[:a 1] [:b 2]]) 
{:b 2, :a 1} 
相关问题