[Python-ideas] Variations on a loop
Arnaud Delobelle
arnodel at googlemail.com
Sat Aug 30 19:56:01 CEST 2008
On 30 Aug 2008, at 16:38, Arnaud Delobelle wrote:
>
> On 29 Aug 2008, at 13:49, Bruce Frederiksen wrote:
>
>> Bruce Leban wrote:
>>>
>>> For example:
>>>
>>> result = ""
>>> for x in items:
>>> result += str(x)
>>> interstitially:
>>> result += ", "
>>> contrariwise:
>>> result = "no data"
>> We already have statements that only apply within loops (break and
>> continue), how about some expressions that only apply in for loops:
>> 'last' and 'empty':
>>
>> for x in items:
>> result += str(x)
>> if not last:
>> result += ', '
>> else:
>> if empty:
>> result = "no data"
>>
>> -bruce (not to be confused with Bruce :-)
>
> note that this can be achieved without 'empty'
>
> for x in items:
> result += str(x)
> if last:
> break
> else:
> result += ', '
> else:
> result = "no data"
>
> Something like this can be implemented in Python with the following
> helper function:
>
> def flaglast(iterable):
> it = iter(iterable)
> for prev in it:
> break
> else:
> return
> for item in it:
> yield prev, False
> prev = item
> yield prev, True
>
> E.g.
>
> >>> list(flaglast([1,2,3]))
> [(1, False), (2, False), (3, True)]
>
> Then you can write your code snippet as:
>
> for x, last in flaglast(items):
> result += str(x)
> if last:
> break
> else:
> result += ', '
> else:
> result = "no data"
>
> --
> Arnaud
>
Also having a 'last' local to a loop implies a lot of overhead in case
one is looping over an iterable whose length is not known - in essence
the overhead in my flaglast function.
Finally, my function works gracefully with nested loops:
for i, i_last in flaglast(items):
for j, j_last in flaglast(jtems):
...
without the need for a 'named loop', about which I feel very
circumspect.
--
Arnaud
More information about the Python-ideas
mailing list