Question: I got two vectors, `[shoes milk shoes]` and `[1 3 1]`, and the map I want to get is `{shoes 2, milk 3}`. I tried to `zipmap` two vectors and only `{shoes 1 milk 3}` shows. Without loop and iterate, is there another way to do that?

Answer: 
you can also employ a bit different solution for that, generating one-entry maps for item-to-amount pair, and then merging them with `+`: 

```
(let [goods '[shoes milk shoes]
      amounts [1 3 1]]
  (apply merge-with + (map hash-map goods amounts)))

;;=> {milk 3, shoes 2}

```
I liked the solution of @leetwinski a lot.

Actually, to solve similar problems in future,
I would suggest, first to collect the values of all keys in lists - in their occurring order:

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

```

Then:

```
(def hm (vecs2hash '[shoes milk shoes milk] [1 4 2 3]))

hm
;; => {milk (4 3), shoes (1 2)}

```

Then, one could write a function dealing with each of the collected elements as you wish.

Define a new function to sum up all values in the list:

```
(defn sum-up-value
  [val]
  (apply + val))

```

Define a helper function to apply the helper function to process all value-lists:

```
(defn apply-to-each-value
  [fun hm]
  (apply hash-map (interleave (keys hm) (map fun (vals hm)))))

```

So in your case:

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

```