Tim Chase <python.l...@tim.thechases.com> writes: > On 10/27/10 09:39, Jussi Piitulainen wrote: >>> So, is there some simple expression in Python for this? Just asking >>> out of curiosity when nothing comes to mind, not implying that there >>> should be or that Python should be changed in any way. >> >> To expand, below is the best I can think of in Python 3 and I'm >> curious if there is something much more concise built in that I am >> missing. >> >> def sed(source, skip, keep, drop): >> >> '''First skip some elements from source, >> then keep yielding some and dropping >> some: sed(source, 1, 2, 3) to skip 1, >> yield 2, drop 3, yield 2, drop 3, ...''' >> >> for _ in range(0, skip): >> next(source) >> while True: >> for _ in range(0, keep): >> yield next(source) >> for _ in range(0, drop): >> next(source) > > Could be done as: (py2.x in this case, adjust accordingly for 3.x) > > def sed(source, skip, keep, drop): > for _ in range(skip): source.next() > tot = keep + drop > for i, item in enumerate(source): > if i % tot < keep: > yield item > > -tkc
With Python 2.7+ you can use itertools.compress: >>> from itertools import * >>> def sed(source, skip, keep, drop): ... return compress(source, chain([0]*skip, cycle([1]*keep + [0]*drop))) ... >>> list(sed(range(20), 1, 2, 3)) [1, 2, 6, 7, 11, 12, 16, 17] -- Arnaud -- http://mail.python.org/mailman/listinfo/python-list