2014-10-08 6 views
1

Как бы вы поместили ценности из списка или вектора в карту?Вернуть карту из списка значений в Clojure

я делаю это следующим образом, но это не кажется простым:

user=> (into {} (map #(into [] %) (partition 2 [1 2 3 4 5 6]))) 
{1 2, 3 4, 5 6} 
user=> 

Или, если я хотел бы также иметь дело с нечетным числом значений (хотя, возможно, не стоит, но, возможно, сохранить ключи):

user=> (into {} (map #(if (even? (count %)) 
    #_=>     (into [] %) 
    #_=>     [(first %) nil]) 
    #_=>    (partition-all 2 [1 2 3 4 5]))) 
{1 2, 3 4, 5 nil} 
user=> 

Есть ли более простой способ сделать это?

+0

Первый может быть выполнен с помощью '(применить хэш-карту [1 2 3 4 5 6])'. – Tomo

+0

Отлично, спасибо @Tomo. Я полагаю, что, используя ваш совет, я могу достичь второго с помощью чего-то вроде '(примените хеш-карту (пусть [a [1 2 3 4 5]] (если (нечетное? (Count a)) (conj a nil) a))) '. Не стесняйтесь поместить его в формат ответа. – pestrella

+0

Посмотрим, сможет ли кто-нибудь умнее меня ответить на него лучше. :) – Tomo

ответ

2

Ниже функция должны заботиться о обеих случаях (при условии, вектора передается в качестве аргумента к карте):

(defn to-map [v] 
    (apply hash-map 
     (if (odd? (count v)) 
      (conj v nil) 
      v))) 
3

версии аллергических к-условным, испытанная для векторов и списков, даже и нечетным.

(defn seq->map 
    [s] 
    (let [s+ (concat s [nil])] 
    (zipmap (take-nth 2 s+) 
      (take-nth 2 (rest s+))))) 

(seq->map '(1 2 3 4)) ; {3 4, 1 2} 
(seq->map '(1 2 3 4 5)) ; {5 nil, 3 4, 1 2} 
(seq->map [1 2 3 4]) ; {3 4, 1 2} 
(seq->map [1 2 3 4 5]) ; {5 nil, 3 4, 1 2} 
Смежные вопросы