2011-09-05 18 views
6

Halihazırda Collective Intelligence Programlama üzerinden çalışmak ve kodu yazmak için Clojure kullanmak. Çalışıyorum, ama bazı bölümler gerçekten çirkin, bu yüzden buradaki uzmanların bir kısmına temizlemeye yardım etmek istediğimi düşündüm.Haritadaki öğeleri bir başka haritanın içeriğine göre kaldırma

ı ("recs 'bağlı) şöyle bir harita var varsayalım:

{"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} 

ve ben' bağlı haritasında (da vardır tuşlarıyla bu öğeleri kaldırmak istiyor MyMovies "):

{"Lady in the Water" 2.8325499182641614, "The Night Listener" 3.3477895267131017, 
"Just My Luck" 2.5309807037655645} 
: bu yüzden haritayı almak

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

Bana oldukça çirkin görünüyor

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

:

Bunu yapmak başardı kod benziyor. "Kaldır" dan geri döndüğüm değerden bir harita oluşturmak için gerekli olması gerektiği gibi görünmüyor. Bunu yapmanın daha temiz bir yolu var mı?

GÜNCELLEME: Joost'un cevabı aşağıdaki başka bir fikri ortaya çıkardı. Ben kümeler halinde iki haritaların anahtarlarını açarsanız ben seçme-tuşları böyle kullanabilirsiniz:

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

Joost, seçmek-tuşları için Beni tahrik için teşekkürler. Bu işlevi daha önce bilmiyordum. Şimdi bu yeni bulunan bilgi ile birkaç bölüm daha yaz!

cevap

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

Güzel! Bu işlevi nasıl kaçırdığımdan emin değilim. Öğrenmek ve hatırlamak için pek çok fonksiyon ... –

+0

Dave ne dedi :) –

2

Aşağıdakiler ilk olarak, tutacak bir tuşlar dizisi oluşturur, daha sonra seçim tuşlarını kullanarak bu tuşlara ait "alt eşlem" komutlarını çıkarır. Ayrıca setlerin öngörüldüğü gerçeğinden faydalanır.

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

Ben ponzao cevabı bu durumda en iyi olduğunu düşünüyorum ama dissoc uygulamak için düşünce olmazdı. Buraya gelebileceğim iki çözüm: umarım onlara bakmak benzer gelecekteki sorunlara yardımcı olur. senin mymovies haritası nil veya false değerlerini içeriyorsa, ikinci çözüm başarısız olur

Not.

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

(into {} 
     (remove (comp mymovies key) recs)) 
İlgili konular