Điều tốt nhất tôi có thể đưa ra là:Trở bản sao trong một chuỗi
(defn dups [seq]
(map (fn [[id freq]] id)
(filter (fn [[id freq]] (> freq 1))
(frequencies seq))))
Có cách nào ngắn gọn hơn?
Điều tốt nhất tôi có thể đưa ra là:Trở bản sao trong một chuỗi
(defn dups [seq]
(map (fn [[id freq]] id)
(filter (fn [[id freq]] (> freq 1))
(frequencies seq))))
Có cách nào ngắn gọn hơn?
Sử dụng một danh sách hiểu:
(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)))
Bạn có thể giải thích (comp # {1} val) đang làm gì không? Thxs. –
(comp # {1} val) về cơ bản có nghĩa là (fn [x] (# {1} (val x))) - về cơ bản, nó kiểm tra nếu giá trị của đối số là 1 (nếu nó chứa trong tập hợp chứa số 1). val ở đây là số đếm trong cặp tần số. –
Nếu bạn muốn tìm thấy bản sao dựa trên một số tài sản của các mục trong danh sách (tức là nó là một danh sách các bản đồ hoặc một danh sách các hồ sơ/đối tượng 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))
kết quả đầu ra:
([:one
[{:attribute :one, :other-things :bob}
{:attribute :one, :other-things :smith}]])
.210
Nếu bạn có một danh sách các đối tượng java và bạn muốn tìm tất cả những người với những cái tên đầu tiên trùng lặp:
(dups-with-function my-list #(.getFirstName %))
lọc tối thiểu và tần số oneliner mà không được công việc:
(filter #(< 1 ((frequencies col) %)) col)
Tuy nhiên nó thực hiện kém trên dữ liệu lớn. Bạn sẽ phải giúp trình biên dịch bằng cách nói:
(let [ freqs (frequencies col) ]
(filter #(< 1 (freqs %)) col))
Tôi thích giải pháp của bạn nhưng chỉ đơn giản là thay thế (fn [[id freq]] id) bằng chức năng chính. –