Что такое идиоматический способ объединения (или получения объединения) двух списков (или последовательностей) в Clojure?
(merge l1 l2)
по-видимому, не является решением:
a=> (merge '(1 2 3) '(2 3 4))
((2 3 4) 1 2 3)
Что такое идиоматический способ объединения (или получения объединения) двух списков (или последовательностей) в Clojure?
(merge l1 l2)
по-видимому, не является решением:
a=> (merge '(1 2 3) '(2 3 4))
((2 3 4) 1 2 3)
Я думаю, что решение andih отлично работает. Вот альтернативный способ, потому что, почему бы и нет. Он использует concat
и distinct
:
user> (distinct (concat '(1 2 3) '(2 3 4)))
=> (1 2 3 4)
Один из способов получить объединение двух списков - использовать union
Clojure> (into #{} (clojure.set/union '(1,2,3) '(3,4,5)))
#{1 2 3 4 5}
или если вы хотите получить список
(into '() (into #{} (clojure.set/union '(1,2,3) '(3,4,5))))
(5 4 3 2 1)
Если вы хотите на самом деле отличать несортированные данные (наборы), вы должны использовать Clojure установить структуру данных вместо векторов или списков. И поскольку andih предложил косвенно, есть основная библиотека для заданных операций: http://clojure.github.com/clojure/clojure.set-api.html
(require '[clojure.set :refer [union]])
(union #{1 2 3} #{3 4 5})
=> #{1 2 3 4 5}
Если наборы по какой-то причине не то, что вы хотите, тогда читайте дальше. Будьте осторожны с concat
, когда у вас есть значительный объем данных в ваших последовательностях, и подумайте об использовании into
, который намного лучше оптимизирован как векторный алгоритм слияния. Я не знаю, почему concat не используется с использованием (или еще лучше), почему concat даже существует? BTW в то время как это происходит значительно быстрее, чем concat, он по-прежнему медленнее, чем conj. Багвелл RRB деревья, совместимые с обоими Clojure и Scala, решает эту проблему, но еще не реализована для Clojure).
Перефразировать нерастормированное решение Omri в терминах "в":
(distinct (into [1 2 3] [3 4 5]))
=> (1 2 3 4 5)
Если вы не возражаете против дубликатов, вы можете попробовать concat:
(concat '(1 2 3 ) '(4 5 6 1) '(2 3))
;;==> (1 2 3 4 5 6 1 2 3)
Один параметр flatten:
(def colls '((1 2 3) (2 3 4)))
(flatten colls) ;; => (1 2 3 2 3 4)
(distinct (flatten colls)) ;; => (1 2 3 4)
Одна вещь, о которой нужно знать, заключается в том, что она будет сглаживать глубоко вложенные коллекции:
(flatten [[1 2 [3 4 5]] [1 [2 [3 4]]]]) ;; => (1 2 3 4 5 1 2 3 4)
Но хорошо работает для карт:
(flatten [[{} {} {}] [{} {} {}]]) ;; => ({} {} {} {} {} {})