Frage

In Clojure, was wäre die schönste Art und Weise ein Schiebefenster über einen (endlichen, nicht zu groß) seq zu haben? Sollte ich nur drop und take und behalten den aktuellen Index oder gibt es eine schönere Art, wie ich bin fehlt?

War es hilfreich?

Lösung

Ich denke, dass Partition mit Schritt 1 tut es:

user=> (partition 3 1 [3 1 4 1 5 9])
((3 1 4) (1 4 1) (4 1 5) (1 5 9))

Andere Tipps

Wenn Sie an den Fenstern arbeiten wollen, kann es auch zweckmäßig sein, das mit der Karte zu tun:

user=> (def a [3 1 4 1 5 9])
user=> (map (partial apply +) (partition 3 1 a))
(8 6 10 15)
user=> (map + a (next a) (nnext a))
(8 6 10 15)

Ich wusste nicht, partition dies tun könnte so implementiert ich es auf diese Weise

(defn sliding-window [seq length]
  (loop [result ()
         remaining seq]
    (let [chunk (take length remaining)]
      (if (< (count chunk) length)
        (reverse result)
        (recur (cons chunk result) (rest remaining))))))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top