In Clojure, what would be the nicest way to have a sliding window over a (finite, not too large) seq? Should I just use drop
and take
and keep track of the current index or is there a nicer way I'm missing?
A sliding window is a sublist or subarray that runs over an underlying data structure . The data structure is typically iterable and ordered, such as an array or a string . At a high level, you can think of it as a subset of the two pointers method.
The Sliding Window algorithm is one way programmers can move towards simplicity in their code. This algorithm is exactly as it sounds; a window is formed over some part of data, and this window can slide over the data to capture different portions of it.
The sliding window provides several benefits: It controls the speed of transmission so that no fast sender can overwhelm the slower receiver; It allows for orderly delivery, as we will show; It allows for retransmission of lost frames, specific retransmission policy depends on the specific implementations.
Install with pip install sliding_window , and run with from sliding_window import window . You're in for a shock if you think list(window(range(10))) should produce something like [[0,1],[1,2],[2,3],...]
I think that partition with step 1 does it:
user=> (partition 3 1 [3 1 4 1 5 9])
((3 1 4) (1 4 1) (4 1 5) (1 5 9))
If you want to operate on the windows, it can also be convenient to do this with map:
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)
I didn't know partition
could do this so I implemented it this way
(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))))))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With