[Python-es] Buscar varios elementos en una lista

marmolro marmolro en gmail.com
Mie Feb 17 08:33:07 CET 2010


2010/2/16 Olemis Lang (Simelix) <olemis+py en gmail.com <olemis%2Bpy en gmail.com>
>

> On 2/16/10, marmolro <marmolro en gmail.com> wrote:
> >
> >
> > 2010/2/16 Daniel Garcia Moreno <dani en danigm.net>
> >
> > > 2010/2/16 Oswaldo Hernández <listas en soft-com.es>:
> > >
> > > > Hola,
> > > >
> > > > Tengo una lista de valores y otra de datos, quiero comprobar si uno
> > > > cualquiera de los valores existe en la lista de datos. En este
> momento
> > lo
> > > > hago utilizando un bucle for para comprobar uno a uno:
> > > >
> > > > valores = (15, 45, 190)
> > > > datos = (22, 33, 55, 567, 44, 234, 45)
> > > > existe = False
> > > >
> > > > for v in valores:
> > > >    if v in datos:
> > > >        existe = True
> > > >        break
> > > >
> > > > if existe:
> > > >    ...
> > > > else:
> > > >    ...
> > > >
> > > > La pregunta es ¿Existe alguna forma mas compacta de hacerlo?
> > > >
> > >
> > > set(valores).intersection(set(datos))
> > >
> > > No se si te he entendido bien, pero si es así, esto debería valer.
> > >
> >
> > Con List comprehensions:
> >
> >
> > >>> [v in datos for v in valores]
> > [False, True, False]
> >
> > y rizando el rizo:
> >
> > >>> True in [v in datos for v in valores]
> > True
> >
> > Ahora bien, no sé si a nivel de prestaciones que es mejor :)
> >
>
> Esto es un poco ineficiente . Mi variante (Py>=2.5 ;o) sería
>
> {{{
> #!python
> any(v in datos for v in valores)
> }}}
>
> usando generadores ;o)
>
> --
> Regards,
>
> Olemis.
>
> Blog ES: http://simelo-es.blogspot.com/
> Blog EN: http://simelo-en.blogspot.com/
>
> Featured article:
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>

Cierto:

{{{
import time

valores = range(40000)
datos = range(0, 10000, 3)

i = time.time()
True in [v in datos for v in valores]
time_option1 = time.time() - i

i = time.time()
any(v in datos for v in valores)
time_option2 = time.time() - i

print time_option1
print time_option2
}}}

>>> 2.96800017357
0.0



Un saludo
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20100217/327e7930/attachment.html>


Más información sobre la lista de distribución Python-es