il meglio che potevo venire con era:Tornando duplicati in una sequenza
(defn dups [seq]
(map (fn [[id freq]] id)
(filter (fn [[id freq]] (> freq 1))
(frequencies seq))))
Esiste un modo più conciso?
il meglio che potevo venire con era:Tornando duplicati in una sequenza
(defn dups [seq]
(map (fn [[id freq]] id)
(filter (fn [[id freq]] (> freq 1))
(frequencies seq))))
Esiste un modo più conciso?
utilizzare un elenco di comprensione:
(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)))
Puoi spiegare cosa sta facendo (comp # {1} val)? Thxs. –
(comp # {1} val) fondamentalmente significa (fn [x] (# {1} (val x))) - fondamentalmente, verifica se la val dell'argomento è 1 (se è contenuta nel set che contiene il numero 1). val qui è il conteggio nella coppia di frequenze. –
Se vuoi per trovare i duplicati in base al largo alcune proprietà degli elementi della lista (cioè si tratta di un elenco di mappe o di un elenco di record/oggetti 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))
uscite:
([:one
[{:attribute :one, :other-things :bob}
{:attribute :one, :other-things :smith}]])
Se si dispone di un elenco di oggetti Java e si desidera trovare tutte quelle con duplicati nomi:
(dups-with-function my-list #(.getFirstName %))
filtro Minimal e frequenze oneliner che fa il lavoro:
(filter #(< 1 ((frequencies col) %)) col)
Tuttavia esegue scarsamente su grandi dati. Dovrai aiutare il compilatore dicendo:
(let [ freqs (frequencies col) ]
(filter #(< 1 (freqs %)) col))
Mi piace la tua soluzione, ma semplicemente sostituire (fn [[id freq]] id) con la funzione chiave. –