У меня есть список ключей: (1 2 3 4)
Как вы преобразовываете список чисел в карту?
Я хочу карту со значениями, установленными в 0, как это: {1 0, 2 0, 3 0, 4 0}
. Как мне это сделать?
У меня есть список ключей: (1 2 3 4)
Как вы преобразовываете список чисел в карту?
Я хочу карту со значениями, установленными в 0, как это: {1 0, 2 0, 3 0, 4 0}
. Как мне это сделать?
Вы могли бы сделать что-то подобное с zipmap функции:
(zipmap '(1 2 3 4) (repeat 0))
=> {4 0, 3 0, 2 0, 1 0}
zipmap принимает список ключей и список значений и преобразует их в карту. Функция repeat
создает бесконечную последовательность из 0s. zipmap
останавливается, когда он достигает конца короткого списка, так что просто не передать ему две бесконечные последовательности :)
Вы также можете создать функцию с 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}
более общий шаблон для этого нужно использовать (apply collection list
для создания коллекции. Все коллекции Clojure имеют «конструкторы» или функции создания, которые принимают переменное количество аргументов и возвращают аргументы, собранные в коллекции. если ваши аргументы уже завернуты в другую коллекцию, тогда применить это удобный способ вывести их из коллекции и передать их функции создания в качестве аргументов.
Это намного больше работы. поэтому у нас есть функции-обертки, такие как zipmap.
Ничего себе я не знал о zipmap, тот полезный
Я бы сделал это, как этот
(apply hash-map (interleave '(1 2 3 4) (repeat 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}
Остерегайтесь: у хэш-карт нет так что вы никогда не должны полагаться на это. Заказ, который вы видите, является совпадением из-за реализации хеш-карт. Посмотрите, что произойдет, когда вы попробуете это с 9 элементами. – TheQuickBrownFox
Да, вы правы. Он сохраняет заказ до 9 ., поэтому он имеет тот же порядок до 9 аргументов! Знаете ли вы, что на? – amirteymuri
Используйте функцию 'type', чтобы увидеть результирующий тип в 8 записей и 9. Я считаю, что Clojure использует« карту массива »для небольших карт в качестве оптимизации производительности. Использование небольших карт для передачи бит данных вокруг является обычным прецедентом, когда нет необходимости использовать умный механизм полной постоянной хэш-карты. – TheQuickBrownFox
В моей исходной функции карты у меня была дополнительная функция на клавише. (map (fn [key] (foo key) ..) .. есть ли способ включить эту функцию в zipmap или я должен просто применить функцию до использования zipmap? – unj2
Это не должно быть проблемой, поскольку карта возвращает последовательность. Просто замените '(1 2 3 4) на вашу функцию карты: например, если вы хотите преобразовать числа в строку, прежде чем сделать их ключ: (zipmap (map # (str%)' (1 2 3 4)) (повтор 0)) => {"4" 0, "3" 0, "2" 0, "1" 0} –