Получить ключ по первому элементу в списке значений в Clojure - PullRequest
0 голосов
/ 03 июня 2018

Это похоже на Clojure получить ключ карты по значению

Однако есть одно отличие.Как бы вы поступили так же, если бы hm был похож на

{1 ["bar" "choco"]}

Идея заключалась в том, чтобы получить 1 (ключ), где первый элемент, если список значений «bar»?Пожалуйста, не стесняйтесь закрывать / объединять этот вопрос, если на него отвечает другой вопрос.

Я пробовал что-то подобное, но это не работает.

(def hm {:foo ["bar", "choco"]})

(keep #(when (= ((nth val 0) %) "bar")
         (key %))
      hm)

Ответы [ 3 ]

0 голосов
/ 03 июня 2018

Другой способ сделать это, используя some:

(some (fn [[k [v & _]]] (when (= "bar" v) k)) hm)

Ваш пример был довольно близок к работе, с некоторыми незначительными изменениями:

(keep #(when (= (nth (val %) 0) "bar")
         (key %))
       hm)

keep и some похожи, но some возвращает только один результат.

0 голосов
/ 04 июня 2018

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

(defn map-invert+ [kfn vfn data]
  (reduce (fn [acc entry] (assoc acc (kfn entry) (vfn entry)))
          {} data))

user> (def data
        {1 ["bar" "choco"]
         2 ["some" "thing"]})
#'user/data

user> (def inverted (map-invert+ (comp first val) key data))
#'user/inverted

user> inverted
;;=> {"bar" 1, "some" 2}

user> (inverted "bar")
;;=> 1
0 голосов
/ 03 июня 2018

Вы можете отфильтровать карту и вернуть первый элемент первого элемента в результирующей последовательности:

(ffirst (filter (fn [[k [v & _]]] (= "bar" v)) hm))

вы можете деструктурировать значение вектора для доступа ко второму и / или третьему элементу, например,

(ffirst (filter (fn [[k [f s t & _]]] (= "choco" s)) 
                {:foo ["bar", "choco"]}))

мимо нескольких первых элементов, которые вы, вероятно, найдете nth более читабельными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...