any() and all() on empty list?

Felipe Almeida Lessa felipe.lessa at gmail.com
Sat Apr 1 12:35:58 EST 2006


Em Sáb, 2006-04-01 às 08:35 -0800, Steve R. Hastings escreveu:
> def tally(seq, d=None):
>     if d == None:
>         d = {}
> 
>     for x in seq:
>         if x in d:
>             d[x] += 1
>         else:
>             d[x] = 1
>     return d 

Two changes:
 - Use "is None".
 - Use "try ... except" instead of "in"

def tally2(seq, d=None):
    if d is None:
        d = {}
    for x in seq:
        try:
            d[x] += 1
        except KeyError:
            d[x]  = 1
    return d

It's also faster:

>>> from random import choice
>>> a = []
>>> for i in xrange(100000):
...     a.append(choice([False, True]))
...
>>> tally(a)
{False: 49922, True: 50078}
>>> tally2(a)
{False: 49922, True: 50078}
>>> from timeit import Timer
>>> min(Timer(stmt='b=tally(a)', setup='from __main__ import a,
tally').repeat(3, 100))
4.2756481170654297
>>> min(Timer(stmt='b=tally2(a)', setup='from __main__ import a,
tally2').repeat(3, 100))
3.812028169631958

Maybe you don't like my version, and the gains aren't that much, but
please use "is None" instead of "== None".

Cheers,

-- 
Felipe.




More information about the Python-list mailing list