count
Bearophile
bearophileHUGS at lycos.com
Wed Jul 8 07:20:56 EDT 2009
Vilya Harvey:
> from itertools import groupby
> for x, g in groupby([fields[1] for fields in data]):
> print x, len(tuple(g))
Avoid that len(tuple(g)), use something like the following, it's lazy
and saves some memory.
def leniter(iterator):
"""leniter(iterator): return the length of a given
iterator, consuming it, without creating a list.
Never use it with infinite iterators.
>>> leniter()
Traceback (most recent call last):
...
TypeError: leniter() takes exactly 1 argument (0 given)
>>> leniter([])
0
>>> leniter([1])
1
>>> leniter(iter([1]))
1
>>> leniter(x for x in xrange(100) if x%2)
50
>>> from itertools import groupby
>>> [(leniter(g), h) for h,g in groupby("aaaabccaadeeee")]
[(4, 'a'), (1, 'b'), (2, 'c'), (2, 'a'), (1, 'd'), (4, 'e')]
>>> def foo0():
... if False: yield 1
>>> leniter(foo0())
0
>>> def foo1(): yield 1
>>> leniter(foo1())
1
"""
# This code is faster than: sum(1 for _ in iterator)
if hasattr(iterator, "__len__"):
return len(iterator)
nelements = 0
for _ in iterator:
nelements += 1
return nelements
Bye,
bearophile
More information about the Python-list
mailing list