typestar

frequencies y group-by en Clojure

Conteo de palabras con frequencies y paradas de metro agrupadas por group-by.

(require '[clojure.string :as str])

(def notice "the tide is out the boats are out the gulls are loud")

;; frequencies counts occurrences and returns a map of item to count
(def word-counts (frequencies (str/split notice #"\s+")))
(println (get word-counts "the") (get word-counts "out"))

(def stops [{:stop "Wharf" :line "A"} {:stop "Mill" :line "B"}
            {:stop "Quay" :line "A"} {:stop "Ash" :line "C"}])

;; group-by builds a map from key fn result to a vector of the matches
(def by-line (group-by :line stops))
(println (map :stop (get by-line "A")))

;; group sizes are group-by plus a walk over the values
(println (reduce-kv (fn [m k v] (assoc m k (count v))) {} by-line))

Cómo funciona

  1. (frequencies (str/split notice #"\s+")) cuenta cada palabra en un mapa de elemento a conteo.
  2. (group-by :line stops) devuelve un mapa del nombre de línea al vector de paradas que coinciden.
  3. reduce-kv recorre by-line y cambia cada vector por su count.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
17
Caracteres a escribir
679
Tokens
120
Ritmo de tres estrellas
70 tpm

Al ritmo de tres estrellas de 70 tokens por minuto, este intento toma unos 103 segundos.

Escribe este fragmento

Paso 1 de 3 en Herramientas de seq; paso 16 de 27 en Fundamentos del lenguaje.

← Anterior Siguiente →