can list comprehensions replace map?
Peter Otten
__peter__ at web.de
Fri Jul 29 14:18:53 EDT 2005
Andrew Dalke wrote:
> Me:
>>> Could make it one line shorter with
>>
>>> from itertools import chain, izip, repeat
>>> def fillzip(*seqs):
>>> def done_iter(done=[len(seqs)]):
>>> done[0] -= 1
>>> if not done[0]:
>>> return []
>>> return repeat(None)
>>> seqs = [chain(seq, done_iter()) for seq in seqs]
>>> return izip(*seqs)
>
> Peter Otten:
>> that won't work because done_iter() is now no longer a generator.
>> In effect you just say
>>
>> seqs = [chain(seq, repeat(None)) for seq in seqs[:-1]] + [chain(seq[-1],
>> [])]
>
> It does work - I tested it. The trick is that izip takes iter()
> of the terms passed into it. iter([]) -> an empty iterator and
> iter(repeat(None)) -> the repeat(None) itself.
Seems my description didn't convince you. So here's an example:
>>> from itertools import chain, izip, repeat
>>> def fillzip(*seqs):
... def done_iter(done=[len(seqs)]):
... done[0] -= 1
... if not done[0]:
... return []
... return repeat(None)
... seqs = [chain(seq, done_iter()) for seq in seqs]
... return izip(*seqs)
...
>>> list(fillzip(range(6), range(3)))
[(0, 0), (1, 1), (2, 2)]
>>>
versus
>>> map(None, range(6), range(3))
[(0, 0), (1, 1), (2, 2), (3, None), (4, None), (5, None)]
Now where's the typo?
> 'Course then the name should be changed.
My variable names where ill-chosen to begin with.
Peter
More information about the Python-list
mailing list