[Python-ideas] Adding a new function "zip_flat" to itertools (Re: Rewriting the "roundrobin" recipe in the itertools documentation)

Terry Reedy tjreedy at udel.edu
Mon Nov 20 18:00:32 EST 2017


On 11/20/2017 4:57 PM, Steven D'Aprano wrote:
> On Mon, Nov 20, 2017 at 12:15:50PM -0500, Terry Reedy wrote:
> 
>>> Your version truncates the results to A B C instead of A B C D E as the
>>> itertools recipe gives.
>>
>> This is due to an off-by-1 error which I corrected 3 hours later in a
>> follow-up post, repeated below.
> 
> Ah, I missed that, thanks.
> 
>>> def roundrobin(*iterables):
>>>       "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
>>>       nexts = cycle(iter(it).__next__ for it in iterables)
>>>       for reduced_len in reversed(range(1, len(iterables))):
>>
>> Make that 0 rather than 1 for start value.
> 
> Is there a reason for calling reversed() instead of reversing the order
> of range in the first place?
> 
> range(len(iterables)-1, -1, -1)

Readability.  Accurately and automatically reversing ranges was one of 
the use cases motivating the addition of 'reversed'.  Ranges have a 
__reversed__ method which returns a iterator for a reversed range.

 >>> reversed(range(0, n))
<range_iterator object at 0x000001FC6BBD5030>
 >>> list(reversed(range(0, n))) == list(iter(range(n-1, -1, -1)))
True

-- 
Terry Jan Reedy



More information about the Python-ideas mailing list