[Python] Unione espressioni regolari
Alberto Granzotto
agranzot a gmail.com
Ven 20 Lug 2012 15:02:27 CEST
2012/7/20 Marco Beri <marcoberi a gmail.com>
> 2012/7/20 Walter Valenti <waltervalenti a yahoo.it>
>
>> In un array di stringhe. Posso sempre infilarli in un tupla.
>>
>
> Una roba così con la funzione all non ti garba?
>
> >>> import re
> >>> s = ["12", "ab", "ZZ"]
> >>> all(re.match(".*%s.*"%e, "abcZZxx12") for e in s)
> True
> >>> all(re.match(".*%s.*"%e, "abcZZxx1") for e in s)
> False
>
molto bello.
questo esempio mi ha acceso una lampadina (ammetto di non essermi mai posto
il problema), `all` e `any` cortocircuitano ma bisogna stare attenti:
In [1]: l = range(1000)
In [2]: timeit all([x for x in l])
10000 loops, best of 3: 42.6 us per loop
In [3]: timeit all(x for x in l)
1000000 loops, best of 3: 661 ns per loop
oppure, per togliere ogni dubbio:
In [7]: def foo(x): print '.',; return x
In [8]: all([foo(x) for x in l])
. . . . . . [tanti altri puntini] .Out[8]: False
In [9]: all(foo(x) for x in l)
.Out[9]: False
nel primo caso mi sa che l'interprete genera la lista che poi è passata a
`all`. Nel secondo invece è sufficientemente sveglio da fare la cosa
giusta. La vedo un po' come la differenza tra range e xrange.
Scusate se per voi era ovvio, per me non lo era :P
ciao,
alberto
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20120720/7a9cd8c1/attachment-0001.html>
Maggiori informazioni sulla lista
Python