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