[Python-Dev] Proposal for a new itertools function: iwindow
Nick Coghlan
ncoghlan at gmail.com
Sun May 28 03:57:51 CEST 2006
Raymond Hettinger wrote:
>> Aahz <aahz at pythoncraft.com> wrote:
>>>> Some open question remain:
>>>> - should iwindow return lists or tuples?
>>>> - what happens if the length of the iterable is smaller than the
>>>> window size, and no padding is specified? Is this an error? Should
>>>> the generator return no value at all or one window that is too small?
>
>
> An itertools windowing function was previously discussed and rejected.
A python-dev Google search for "itertools window" found me your original
suggestion to include Jack Diedrich's itertools.window in Python 2.3 (which
was only deferred because 2.3 was already past beta 1 at that point).
I couldn't find any discussion of the idea after that (aside from your
pointing out that you'd never found a real-life use case for the pairwise()
recipe in the docs, which is a basic form of windowing).
One option would be to add a windowing function to the recipes in the
itertools docs. Something like:
def window(iterable, window_len=2, window_step=1):
iterators = tee(iterable, window_len)
for skip_steps, itr in enumerate(iterators):
for ignored in islice(itr, skip_steps):
pass
window_itr = izip(*iterators)
if window_step != 1:
window_itr = islice(window_itr, step=window_step)
return window_itr
As you can see, I'd leave the padding out of this function signature - if you
want padding you can more easily specify it directly when calculating the
iterable to be windowed. Do you want padding before and after the sequence, or
just after? Pad with None or with zeroes? Better to expand on the "padnone"
recipe:
def pad(iterable, pad_value=None, times=None):
"""Pads an iterable with a repeating value
The quantity of padding may be limited by specifying
a specific number of occurrences.
"""
return chain(iterable, repeat(pad_value, times))
def padwindow(iterable, window_len, pad_value=None):
"""Pads an iterable appropriately for the given window length
Padding is added to both the front and back of the sequence
such that the first and last windows will each contain one
value from the actual sequence.
"""
return chain(repeat(pad_value, window_len-1),
iterable,
repeat(pad_value, window_len-1))
Cheers,
Nick.
--
Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
---------------------------------------------------------------
http://www.boredomandlaziness.org
More information about the Python-Dev
mailing list