Lo mejor que podía venir fue:duplicados en una secuencia
(defn dups [seq]
(map (fn [[id freq]] id)
(filter (fn [[id freq]] (> freq 1))
(frequencies seq))))
¿Hay una manera más concisa?
Lo mejor que podía venir fue:duplicados en una secuencia
(defn dups [seq]
(map (fn [[id freq]] id)
(filter (fn [[id freq]] (> freq 1))
(frequencies seq))))
¿Hay una manera más concisa?
utilizar una lista de comprensión:
(defn dups [seq]
(for [[id freq] (frequencies seq) ;; get the frequencies, destructure
:when (> freq 1)] ;; this is the filter condition
id)) ;; just need the id, not the frequency
(map key (remove (comp #{1} val)
(frequencies seq)))
¿Puedes explicar qué está haciendo (comp # {1} val)? Thxs. –
(comp # {1} val) significa básicamente (fn [x] (# {1} (val x))) - básicamente, prueba si el valor del argumento es 1 (si está contenido en el conjunto que contiene el número) 1). val aquí es el recuento en el par de frecuencias. –
Si desea encontrar duplicados con sede fuera alguna propiedad de los elementos de la lista (es decir, se trata de una lista de los mapas o una lista de registros/objetos Java)
(defn dups-with-function
[seq f]
(->> seq
(group-by f)
; filter out map entries where its value has only 1 item
(remove #(= 1 (count (val %))))))
(let [seq [{:attribute :one
:other-things :bob}
{:attribute :one
:other-things :smith}
{:attribute :two
:other-things :blah}]]
(dups-with-function seq :attribute))
salidas:
([:one
[{:attribute :one, :other-things :bob}
{:attribute :one, :other-things :smith}]])
Si usted tiene una lista de objetos de Java y desea encontrar todos los que tienen duplicados primeros nombres:
(dups-with-function my-list #(.getFirstName %))
filtro Mínimo y frecuencias oneliner que hace el trabajo:
(filter #(< 1 ((frequencies col) %)) col)
Sin embargo se lleva a cabo mal en grandes datos. Deberá ayudar al compilador diciendo:
(let [ freqs (frequencies col) ]
(filter #(< 1 (freqs %)) col))
Me gusta su solución pero simplemente reemplazaría (fn [[id id]] id) con la función de la tecla. –