2011-11-08 20 views
9

Đ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?

+0

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. –

Trả lời

16

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 
11
(map key (remove (comp #{1} val) 
       (frequencies seq))) 
+0

Bạn có thể giải thích (comp # {1} val) đang làm gì không? Thxs. –

+0

(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ố. –

4

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 %)) 
0

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)) 
Các vấn đề liên quan