Удаление элементов с карты на основе содержимого другой карты - PullRequest
6 голосов
/ 05 сентября 2011

Все еще работаю через Программирование Коллективного Разума и использование Clojure для написания кода.У меня это работает, но некоторые части действительно ужасны, поэтому я подумал, что я попрошу некоторых экспертов, которые здесь присутствуют, помочь разобраться.

Предположим, у меня есть карта, которая выглядит следующим образом (связана с " recs "):

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

, и я хочу удалить эти элементы с ключами, которыетакже на карте (привязанной к " mymovies "):

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

, чтобы я получил карту:

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

код, который мне удалось получитьсделать это выглядит так:

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

Это кажется мне довольно уродливым.Не похоже, что нужно создавать карту из значения, которое я получаю из «удалить».Есть ли более чистый способ сделать это?

ОБНОВЛЕНИЕ: ответ Джоста ниже вызвал другую идею.Если я превращу ключи двух карт в наборы, я могу использовать клавиши выбора следующим образом:

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

Joost, спасибо, что включили меня в клавиши выбора .Я не знал об этой функции раньше.Теперь, чтобы пойти переписать несколько других разделов с этим новым найденным знанием!

Ответы [ 3 ]

13 голосов
/ 06 сентября 2011
(apply dissoc recs (keys mymovies))
2 голосов
/ 06 сентября 2011

Далее сначала создается последовательность ключей для сохранения, затем извлекается «подкарта» для этих ключей из записей с использованием клавиш выбора.Он также использует тот факт, что наборы являются предикатами.

(select-keys recs (remove (apply hash-set (keys mymovies)) (keys recs)))
0 голосов
/ 02 ноября 2011

Я думаю, что ответ Понзао лучше для этого случая, но я бы не подумал применить dissoc. Вот два решения, которые я мог бы придумать: надеюсь, что их просмотр поможет с похожими проблемами в будущем.

Обратите внимание, что второе решение будет неудачным, если ваша карта mymovies содержит ноль или ложные значения.

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

(into {}
      (remove (comp mymovies key) recs))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...