Как я могу удалить элемент из последовательности в Clojure? - PullRequest
34 голосов
/ 02 июня 2009

Во-первых, я предполагаю, что каждая структура-специфическая последовательность будет иметь разные способы удаления элемента: Векторы могут быть по индексу, Список может быть удален первым или последним, Набор должен передавать фактический элемент для удаления и т. Д.

Во-вторых, я предполагаю, что есть некоторые методы удаления, которые не зависят от структуры; они работают на seq интерфейсе.

Поскольку последовательности в Clojure неизменны, я подозреваю, что вы на самом деле делаете дешевую копию оригинала, только без оригинального предмета. Это означает, что для удаления может использоваться понимание списка, но я подозреваю, что оно будет излишне многословным.

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

Ответы [ 3 ]

43 голосов
/ 02 июня 2009

Не существует единого интерфейса для удаления объектов из всех типов структур данных Clojure, возможно, из-за различных характеристик производительности.

(disj #{:foo :bar} :foo)       ; => #{:bar}
(dissoc {:foo 1 :bar 2} :foo)  ; => {:bar 2}
(pop [:bar :foo])              ; => [:bar]
(pop (list :foo :bar))         ; => (:bar)

Они также работают (возвращая seq):

(remove #{:foo} #{:foo :bar})      ; => (:bar)
(remove #{:foo} [:foo :bar])       ; => (:bar)
(remove #{:foo} (list :foo :bar))  ; => (:bar)

Это не работает для хеш-карт, потому что когда вы перебираете карту, вы получаете пары ключ / значение. Но это работает:

(remove (fn [[k v]] (#{:foo} k)) {:foo 1 :bar 2})  ; => ([:bar 2])
12 голосов
/ 02 июня 2009

Посмотрите на ссылку Clojure для последовательностей . filter и remove - это то, что вы ищете.

2 голосов
/ 12 июня 2009

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

...