2011-09-05 35 views
6

Vẫn đang làm việc thông qua Lập trình tập thể thông minh và sử dụng Clojure để viết mã. Tôi đã có nó làm việc, nhưng một số bộ phận thực sự xấu xí, vì vậy tôi nghĩ rằng tôi muốn hỏi một số các chuyên gia xung quanh đây để giúp làm sạch nó lên.Xóa các mục khỏi bản đồ dựa trên nội dung của một bản đồ khác

Giả sử tôi có một bản đồ mà trông như thế này (ràng buộc để "REC '):

{"Superman Returns" 3.902419556891574, "Lady in the Water" 2.8325499182641614, 
"Snakes on a Plane" 3.7059737842895792, "The Night Listener" 3.3477895267131017, 
"You, Me and Dupree" 2.651006036204627, "Just My Luck" 2.5309807037655645} 

và tôi muốn loại bỏ những mặt hàng với các phím mà cũng nằm trong bản đồ (ràng buộc để' mymovies "):

{"Snakes on a Plane" 4.5, "You, Me and Dupree" 1.0, "Superman Returns" 4.0} 

vì vậy mà tôi có được bản đồ:

{"Lady in the Water" 2.8325499182641614, "The Night Listener" 3.3477895267131017, 
"Just My Luck" 2.5309807037655645} 

mã mà tôi quản lý để có được để làm điều này trông giống như:

(apply merge (map #(hash-map (first %) (second %)) 
       (remove #(contains? mymovies (first %)) 
         recs))) 

Điều đó có vẻ khá xấu xí với tôi. Có vẻ như không cần thiết phải tạo bản đồ từ giá trị mà tôi lấy lại từ "xóa". Có cách nào sạch hơn để làm việc này không?

CẬP NHẬT: Câu trả lời của Joost dưới đây đã làm nảy sinh ý tưởng khác. Nếu tôi bật các phím của hai bản đồ thành các tập Tôi có thể sử dụng select-phím như thế này:

(select-keys recs (difference (set (keys recs)) 
           (set (keys mymovies)))) 

Joost, nhờ chuyển cho tôi vào chọn-phím. Tôi không biết về chức năng đó trước đây. Bây giờ để viết lại một số phần khác với kiến ​​thức mới được tìm thấy này!

Trả lời

13
(apply dissoc recs (keys mymovies)) 
+0

Tốt! Không chắc chắn làm thế nào tôi bỏ lỡ chức năng đó. Có rất nhiều chức năng để học và ghi nhớ ... –

+0

Điều Dave nói :) –

2

Sau đây đầu tiên xây dựng một mã khóa để giữ lại, sau đó trích xuất "sơ đồ con" cho các phím từ recs bằng cách sử dụng các phím chọn. Nó cũng lợi dụng thực tế là các tập hợp là các biến vị ngữ.

(select-keys recs (remove (apply hash-set (keys mymovies)) (keys recs))) 
0

Tôi nghĩ rằng câu trả lời ponzao là tốt nhất cho trường hợp này, nhưng tôi sẽ không có suy nghĩ để áp dụng dissoc. Dưới đây là hai giải pháp tôi có thể đã đưa ra: hy vọng nhìn qua chúng sẽ giúp với các vấn đề tương tự trong tương lai.

Lưu ý rằng giải pháp thứ hai sẽ thất bại nếu bản đồ mymovies của bạn chứa giá trị không hoặc giá trị sai.

(into {} 
     (for [[k v] recs 
      :when (not (contains? mymovies k))] 
     [k v])) 

(into {} 
     (remove (comp mymovies key) recs)) 
Các vấn đề liên quan