2009-10-07 2 views

ответ

15

Вы могли бы сделать что-то подобное с zipmap функции:

(zipmap '(1 2 3 4) (repeat 0)) 
=> {4 0, 3 0, 2 0, 1 0} 

zipmap принимает список ключей и список значений и преобразует их в карту. Функция repeat создает бесконечную последовательность из 0s. zipmap останавливается, когда он достигает конца короткого списка, так что просто не передать ему две бесконечные последовательности :)

+0

В моей исходной функции карты у меня была дополнительная функция на клавише. (map (fn [key] (foo key) ..) .. есть ли способ включить эту функцию в zipmap или я должен просто применить функцию до использования zipmap? – unj2

+0

Это не должно быть проблемой, поскольку карта возвращает последовательность. Просто замените '(1 2 3 4) на вашу функцию карты: например, если вы хотите преобразовать числа в строку, прежде чем сделать их ключ: (zipmap (map # (str%)' (1 2 3 4)) (повтор 0)) => {"4" 0, "3" 0, "2" 0, "1" 0} –

1

Вы также можете создать функцию с zipmap Джеймса:

Clojure=> (defn map-to-n [n] (zipmap (range 1 n) (repeat 0))) 
#'user/map-to-n 
Clojure=> (map-to-n 10) 
{9 0, 8 0, 7 0, 6 0, 5 0, 4 0, 3 0, 2 0, 1 0} 
1

более общий шаблон для этого нужно использовать (apply collection list для создания коллекции. Все коллекции Clojure имеют «конструкторы» или функции создания, которые принимают переменное количество аргументов и возвращают аргументы, собранные в коллекции. если ваши аргументы уже завернуты в другую коллекцию, тогда применить это удобный способ вывести их из коллекции и передать их функции создания в качестве аргументов.

Это намного больше работы. поэтому у нас есть функции-обертки, такие как zipmap.

1

Ничего себе я не знал о zipmap, тот полезный

Я бы сделал это, как этот

(apply hash-map (interleave '(1 2 3 4) (repeat 0))) 
0

просто еще один способ, который сохраняет первоначальный порядок ключей (до 9 ключей !):

(defn list-to-map [& n] (->> (map vector n (repeat 0)) (into (hash-map))))

(list-to-map 1 2 3 4) =>{1 0, 2 0, 3 0, 4 0}

(list-to-map 4 3 2 1) =>{4 0, 3 0, 2 0, 1 0}

+0

Остерегайтесь: у хэш-карт нет так что вы никогда не должны полагаться на это. Заказ, который вы видите, является совпадением из-за реализации хеш-карт. Посмотрите, что произойдет, когда вы попробуете это с 9 элементами. – TheQuickBrownFox

+0

Да, вы правы. Он сохраняет заказ до 9 ., поэтому он имеет тот же порядок до 9 аргументов! Знаете ли вы, что на? – amirteymuri

+0

Используйте функцию 'type', чтобы увидеть результирующий тип в 8 записей и 9. Я считаю, что Clojure использует« карту массива »для небольших карт в качестве оптимизации производительности. Использование небольших карт для передачи бит данных вокруг является обычным прецедентом, когда нет необходимости использовать умный механизм полной постоянной хэш-карты. – TheQuickBrownFox

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