[Python-ideas] [Python-Dev] Proposal: new list function: pack
Nick Coghlan
ncoghlan at gmail.com
Sat Mar 21 05:35:12 CET 2009
Josiah Carlson wrote:
> iwinslice() is just as bad of a name as any of the others.
>
> I have seen the equivalent of window(iterator, size=2, step=1), which
> works as you would expect (both as the output, as well as the
> implementation), with size and step both limited to 5 (because if you
> are doing things with more than 5 items at a time...you probably
> really want something else, and in certain cases, you can use multiple
> window calls to compose larger groups).
Oops, I didn't realise this thread had moved over here, so I just
repeated what yourself and Raymond said over on python-dev. Oh well...
> I'd be a -0 on the feature, because as Raymond says, it's trivial to
> implement with a deque. And as I've said before, not all x line
> functions should be built-in.
That does raise the possibility of adding "iterator windowing done
right" by including a deque based implementation in itertools (or at
least in the itertools recipes page).
For example, the following continuously yields the same deque, but each
time the contents represent a new window onto the underlying data:
from collections import deque
def window (iterable, size=2, step=1, overlap=0):
itr = iter(iterable)
new_per_window = size - overlap
contents = deque(islice(itr, 0, size*step, step), size)
while True:
yield contents
new_data = list(islice(itr, 0, new_per_window*step, step))
if len(new_data) < new_per_window:
break
contents.extend(new_data)
(There are other ways of doing it that involve less data copying, but
the above way seems to be the most straightforward)
Cheers,
Nick.
--
Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
---------------------------------------------------------------
More information about the Python-ideas
mailing list