Data structures Clojure中的地图合并

Data structures Clojure中的地图合并,data-structures,clojure,Data Structures,Clojure,我正在寻找一种方法来合并4个单独的地图列表。我正在抓取一个网站,它以下面的数据*的形式给我一个属性列表 def数据1'1 def数据2'2 def数据3'3 def数据4'4 …我正在根据关键点组织它们: 映射关联{}:a%data1 映射关联{}:b%data2 映射关联{}:c%data3 映射关联{}:d%data4 上述代码生成以下数据结构: {:a1}{:a1}{:a1}{:a1}{:a1} {:b2}{:b2}{:b2}{:b2}{:b2} {:c3}{:c3}{:c3}{:c3}{

我正在寻找一种方法来合并4个单独的地图列表。我正在抓取一个网站,它以下面的数据*的形式给我一个属性列表

def数据1'1 def数据2'2 def数据3'3 def数据4'4 …我正在根据关键点组织它们:

映射关联{}:a%data1 映射关联{}:b%data2 映射关联{}:c%data3 映射关联{}:d%data4 上述代码生成以下数据结构:

{:a1}{:a1}{:a1}{:a1}{:a1} {:b2}{:b2}{:b2}{:b2}{:b2} {:c3}{:c3}{:c3}{:c3}{:c3} {:d4}{:d4}{:d4}{:d4}{:d4} 我想垂直组合这些列表,因此我有以下内容:

def want[{:a1,:b2,:c3,:d4} {:a1,:b2,:c3,:d4} {:a1,:b2,:c3,:d4} {:A1,:B2,:C3,:D4}] 这将允许我遍历地图列表,并从每个地图中选择一个特定的值,将它们显示在网页上。但我不确定如何获得我想要的数据结构。感谢您的帮助……

Map从提供的集合中获取第一次、第二次等组合,并在每个集合上执行一个功能。因此,它非常适合转换集合。此处显示的向量是用于说明换位的最简单函数:

(map vector
  [{:a "1"} {:a "1"} {:a "1"} {:a "1"}]
  [{:b "2"} {:b "2"} {:b "2"} {:b "2"}]
  [{:c "3"} {:c "3"} {:c "3"} {:c "3"}]
  [{:d "4"} {:d "4"} {:d "4"} {:d "4"}]))

=>([{:a "1"} {:b "2"} {:c "3"} {:d "4"}]
   [{:a "1"} {:b "2"} {:c "3"} {:d "4"}]
   [{:a "1"} {:b "2"} {:c "3"} {:d "4"}]
   [{:a "1"} {:b "2"} {:c "3"} {:d "4"}])
合并合并哈希映射:

(merge {:a "1"} {:b "2"} {:c "3"} {:d "4"})
=> {:d "4", :c "3", :b "2", :a "1"}
将这两者结合起来,以获得所需的效果:

(map merge
     [{:a "1"} {:a "1"} {:a "1"} {:a "1"}]
     [{:b "2"} {:b "2"} {:b "2"} {:b "2"}]
     [{:c "3"} {:c "3"} {:c "3"} {:c "3"}]
     [{:d "4"} {:d "4"} {:d "4"} {:d "4"}]))

=>({:d "4", :c "3", :b "2", :a "1"}
   {:d "4", :c "3", :b "2", :a "1"}
   {:d "4", :c "3", :b "2", :a "1"}
   {:d "4", :c "3", :b "2", :a "1"})

我不清楚你为什么要做这个中间步骤

(map #(assoc {} :a %) ...)
如果您的数据是

(def data [["1" "1" "1" "1"] 
           ["2" "2" "2" "2"] 
           ["3" "3" "3" "3"] 
           ["4" "4" "4" "4"]])
你的钥匙还在

(def my-keys [:a :b :c :d])
然后你就可以使用zipmap了


注意:应用地图列表数据用于将数据转换到与按键相关的正确方向。

mapv而不是map?您为什么要这样做?问题中没有说明结果将如何使用,它很可能是惰性的。want作为一个向量表示,我们被告知它将用于迭代地图列表,并从每个地图中选择一个特定的值。没有真正的方法在def表单中表示want为惰性。简言之,在将“应用地图列表数据”更改为mapv矢量数据后,此操作有效。数据在4个单独的SEXPR中生成,实际上是从Enlive库中选择函数。每个选择都会引出一个不同的元素:首先是href,然后是a文本,等等。因此我有一个很长的href列表,另一个描述链接的文本列表,等等。在将它们合并到地图之前,我关联相应的键,作为描述链接属性的一种方式。
(mapv zipmap (repeat my-keys) (apply map list data))


;=> [{:d "4", :c "3", :b "2", :a "1"}
;    {:d "4", :c "3", :b "2", :a "1"}
;    {:d "4", :c "3", :b "2", :a "1"}
;    {:d "4", :c "3", :b "2", :a "1"}]