2013-05-27 9 views
2

Я хочу, чтобы объединить элементы из двух списков, моя программа выглядит следующим образомКак объединить элементы из двух списков

(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)))) 

Но когда я звоню создать-карту в результате карты в списке дублируется. Я вижу, что я получил Cartesian, потому что я не сказал, как будут сочетаться элементы. И я хочу, первый элемент из первой карты и первый из второй карты должны быть объединены, второй элемент из первой карты и второй из второй карты, и т.д ...

ответ

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)) 
+0

спасибо, так что это должно быть (описание названия карт) – Vesna

0

Так сноска должна выглядеть следующим образом

(defn create-map [](map conj titles descriptions)) 

Благодаря @A. Webb

Смежные вопросы