我想要合并两个列表中的元素,我的程序看起来像这样
(ns datamodel
(:use
[net.cgrand.enlive-html :as en-html ])
(:require
[clojure.zip :as z]
[clojure.data.zip.xml :only (attr text xml->) :as xz]
[clojure.xml :as xml ]
[clojure.data.zip.xml :as zf]
[clojure.java.io :as io]
))
(def data-url "http://api.eventful.com/rest/events/search?app_key=4H4Vff4PdrTGp3vV&keywords=music&location=Belgrade&date=Future")
(defn map-tags-contents [url & tags]
(map #(hash-map % (keyword (last tags)))
(mapcat (comp :content z/node)
(apply xz/xml->
(-> url xml/parse z/xml-zip)
(for [t tags]
(zf/tag= t)
)))))
(def titles (map-tags-contents data-url :events :event :title))
(def descriptions (map-tags-contents data-url :events :event :description))
(defn create-map [](for [el1 titles
el2 descriptions] (into {} (conj el1 el2 ))))
但是当我调用create-map时,列表中的结果映射是重复的。我看到我得到了笛卡尔联合,因为我没有说元素的组合方式。我想要第一个地图的第一个元素和第二个地图的第一个元素,第一个地图的第二个元素和第二个地图的第二个元素......
答案 0 :(得分:4)
元素组合
(map list [1 2 3] [:a :b :c]) ;=> ((1 :a) (2 :b) (3 :c))
笛卡尔积
(for [x [1 2 3], y [:a :b :c]] (list x y))
;=> ((1 :a) (1 :b) (1 :c) (2 :a) (2 :b) (2 :c) (3 :a) (3 :b) (3 :c))
答案 1 :(得分:0)
所以fn看起来应该是这样的
(defn create-map [](map conj titles descriptions ))
感谢@A。韦伯