Преобразование вложенных списков в список множеств в Clojure? - PullRequest
7 голосов
/ 14 марта 2011

Имеет список списков одинакового размера, например:

(def d [["A" "B"] ["A" "C"] ["H" "M"]])

Как его можно преобразовать в список наборов, каждый набор для индексов выше:

[#{"A" "H"} #{"B" "C" "M"}]

Ответы [ 3 ]

17 голосов
/ 14 марта 2011
(map set (apply map vector d))

"(apply map vector)" - это то, что называется "zip" в других языках, таких как Python.Он вызывает vector для первого элемента каждого элемента d, затем для второго элемента каждого элемента и т. Д.

Затем мы вызываем set для каждой из этих коллекций.

4 голосов
/ 14 марта 2011

, если хеш-набор допускает дублирование ключей, вы можете использовать:

(apply map hash-set d)

, вместо этого вы можете сделать более гадкий

(apply map (fn [& s] (set s)) d)
1 голос
/ 14 марта 2011

Я бы предложил следующее:

(reduce
  (fn [sets vals]
    (map conj sets vals))
  (map hash-set (first d))
  (rest d))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...