Альтернативы для преобразования списка вложенных карт в карту - PullRequest
2 голосов
/ 30 октября 2011

У меня есть следующий рабочий код для преобразования списка с вложенными картами (фактически данными твитов) в карту:

(defn filter
  "This function returns a map with the user as key, #followers as value"
  [raw-tweets]

  (let [users (map :user raw-tweets)
        names (map :name users)
        followers (map :followers_count users)]
    (zipmap names followers)))

Хотя это работает, как и ожидалось, мне было интересно, будет ли более идиоматичныйспособ сделать это в Clojure.Есть альтернативы?

Ответы [ 4 ]

2 голосов
/ 30 октября 2011

То, что у вас есть, хорошо, хотя вы можете построить карту по ходу, используя уменьшение:

(defn user-followers [raw-tweets]
  (reduce #(assoc %1 (:name %2) (:followers_count %2))
    {} (map :user raw-tweets)))
1 голос
/ 02 ноября 2011

Мне не нравится шаблон (map (fn ...)) - это на самом деле просто уродливый способ написать for понимание. Я бы написал это как:

(into {}
      (for [{:keys [user]} raw-tweets]
        ((juxt :name :followers_count) user)))

Или это, которое кажется мне менее естественным, но избегает придумывать имена для значений, которые вы все равно будете использовать один раз.

(into {} (map (comp (juxt :name :followers_count) :user)
              raw-tweets))
1 голос
/ 30 октября 2011

Я нахожу ответ @ Даана хорошим, но я бы добавил деструктуризацию в смесь.

(defn filter-tweets
  "This function returns a map with the user as key, #followers as value"
  [raw-tweets]
  (into {} (map (fn [{{name :name follower-count :followers_count} :user}]
                  [name follower-count])
                raw-tweets)))
1 голос
/ 30 октября 2011

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

(defn filter
  "This function returns a map with the user as key, #followers as value"
  [raw-tweets]
  (into {} (map #(let [user (:user %)]
                   [(:name user) (:followers_count user)])
                raw-tweets)))

Он сопоставляет необработанные твиты с функцией, которая извлекает пользователя для каждого твита и возвращает вектор с именем и количеством подписчиков для этого пользователя.Функция into принимает две последовательности и соединяет каждый элемент второго с первым, что превращает список векторов в карту, прежде чем он будет возвращен из функции фильтра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...