Dictionary 合并并计算两个向量返回图Clojure

Dictionary 合并并计算两个向量返回图Clojure,dictionary,vector,clojure,zipmap,Dictionary,Vector,Clojure,Zipmap,我得到了两个向量,[shoes milk shoes]和[13 1],我想得到的地图是{shoes 2,milk 3}。我试着压缩两个向量,只显示{shoes 1 milk 3}。如果没有循环和迭代,还有其他方法吗?您可以使用reduce: 从两个列表中建立键/值的元组 累加到映射中:将该值添加到映射中键的值中,如果传递的是缺少的nil,则从0开始 让[v1'[鞋牛奶鞋] v2[1 3 1]] 减少 fn[m[k v]] 更新m k fnil+0 v {}

我得到了两个向量,[shoes milk shoes]和[13 1],我想得到的地图是{shoes 2,milk 3}。我试着压缩两个向量,只显示{shoes 1 milk 3}。如果没有循环和迭代,还有其他方法吗?

您可以使用reduce:

从两个列表中建立键/值的元组 累加到映射中:将该值添加到映射中键的值中,如果传递的是缺少的nil,则从0开始 让[v1'[鞋牛奶鞋] v2[1 3 1]] 减少 fn[m[k v]] 更新m k fnil+0 v {} 映射向量v1 v2 ; → {鞋子2,牛奶3}
您还可以为此采用一种稍有不同的解决方案,为项目到金额对生成一个条目映射,然后将它们与+:


我非常喜欢@leetwinski的解决方案

其实为了以后解决类似的问题,, 我建议,首先收集列表中所有键的值-按其发生顺序:

(defn vecs2hash 
  [keys values]
  (apply merge-with concat (map (fn [k v] {k (list v)}) keys values)))
然后:

然后,可以编写一个函数来处理所收集的每个元素

定义一个新函数以汇总列表中的所有值:

(defn sum-up-value
  [val]
  (apply + val))
定义一个helper函数以应用helper函数来处理所有值列表:

(defn apply-to-each-value
  [fun hm]
  (apply hash-map (interleave (keys hm) (map fun (vals hm)))))
因此,在你的情况下:

(apply-to-each-value sum-up-values hm)
;; {milk 7, shoes 3}

向量不是固定的。可能是[鞋奶]或[鞋奶鞋花]。此外,相应的向量也发生了变化。请将此信息添加到您的问题中,以便更多的人可以看到它。不是每个人都会看评论。当你不确定值的类型是什么时,flatte几乎从来都不好:vecs2hash[:a:b:a][[1 2][2 3][3 4]=>{:b[2 3],:a 1 2 3 4}。我建议这样做:defnvecs2hash[keys-values]应用与concat-map-fn[kv]{k[v]}键值合并
(defn apply-to-each-value
  [fun hm]
  (apply hash-map (interleave (keys hm) (map fun (vals hm)))))
(apply-to-each-value sum-up-values hm)
;; {milk 7, shoes 3}