¿Cómo puedo eliminar un elemento de una secuencia en Clojure?
sequences (3)
En primer lugar, supongo que cada secuencia específica de la estructura tendría diferentes formas de eliminar un elemento: los vectores podrían ser por índice, la lista podría eliminarse primero o el último, Set debería pasar el elemento real para eliminar, etc.
En segundo lugar, supongo que hay algunos métodos de eliminación que son independientes de la estructura; ellos trabajan en la interfaz seq .
Dado que las secuencias son inmutables en Clojure, sospecho que lo que estás haciendo realmente es hacer una copia barata del original, solo que sin el artículo original. Esto significa que la comprensión de la lista podría utilizarse para la eliminación, pero sospecho que sería innecesariamente detallado.
Por favor, da algunos ejemplos idiomáticos de las diferentes formas de eliminar elementos de las secuencias de Clojure.
Como una extensión de la respuesta de Brian Carper. Depende de lo que harás con el resultado. Si está pasando el resultado a algo que quiere trabajar en todo el conjunto de datos (es decir, imprimirlo) es idiomático hacer un seq y usar el filtro o eliminar para resolver el problema perezosamente. Si, por otro lado, está modificando la estructura de datos para ahorrar para varios usos posteriores, la creación de un seq perderá sus características de actualización favorables, por lo que en este caso es mejor utilizar la función de actualización específica de esa estructura de datos.
Mira la referencia de Clojure para las secuencias . filter
y remove
son lo que buscas.
No existe una interfaz única para eliminar elementos de todos los tipos de estructura de datos de Clojure, posiblemente debido a las diferentes características de rendimiento.
(disj #{:foo :bar} :foo) ; => #{:bar}
(dissoc {:foo 1 :bar 2} :foo) ; => {:bar 2}
(pop [:bar :foo]) ; => [:bar]
(pop (list :foo :bar)) ; => (:bar)
Estos también funcionan (devolviendo un seq
):
(remove #{:foo} #{:foo :bar}) ; => (:bar)
(remove #{:foo} [:foo :bar]) ; => (:bar)
(remove #{:foo} (list :foo :bar)) ; => (:bar)
Esto no funciona para hash-maps porque cuando iteras sobre un mapa, obtienes pares clave / valor. Pero esto funciona:
(remove (fn [[k v]] (#{:foo} k)) {:foo 1 :bar 2}) ; => ([:bar 2])