Into itertools
Arnaud Delobelle
arnodel at googlemail.com
Mon Apr 27 04:50:42 EDT 2009
On 26 Apr, 17:32, bearophileH... at lycos.com wrote:
> Some idioms are so common that I think they deserve to be written in C
> into the itertools module.
>
> 1) leniter(iterator)
[...]
> A Python implementation:
>
> def leniter(iterator):
> if hasattr(iterator, "__len__"):
> return len(iterator)
> nelements = 0
> for _ in iterator:
> nelements += 1
> return nelements
Some people would write it as:
def leniter(iterable):
if hasattr(iterable, '__len__'):
return len(iteratble)
return sum(1 for _ in iterable)
[...]
> 2) xpairwise(iterable)
>
> This is at the the bottom of the itertools docs:
>
> def pairwise(iterable):
> a, b = tee(iterable)
> for elem in b:
> break
> return izip(a, b)
>
> The following of mine is faster:
>
> def xpairwise(iterable):
> return izip(iterable, islice(iterable, 1, None))
This doesn't work if the iterable is an iterator.
E.g
>>> it = iter(range(5))
>>> list(xpairwise(it))
[(0, 2), (3, 4)]
[...]
> 3) xpairs(seq)
>
> This is a Python implementation:
>
> def xpairs(seq):
> len_seq = len(seq)
> for i, e1 in enumerate(seq):
> for j in xrange(i+1, len_seq):
> yield e1, seq[j]
>
Why not:
def xpairs(seq):
for i, el in enumerate(seq):
for j in xrange(i):
yield seq[j], el
--
Arnaud
More information about the Python-list
mailing list