[Python-es] Iterar 2 veces sobre 1 lista y comparar sus objetos lo mas rapido
tny
a.porrua en gmail.com
Lun Mayo 9 10:44:07 CEST 2011
El lun, 09-05-2011 a las 04:49 +0200, lasizoillo escribió:
> El día 9 de mayo de 2011 00:17, lopz <lowlifebob en gmail.com> escribió:
> > Hola, estoy haciendo unas pequeñas pruebas en pygame
> > def compare(tags1, tags2):
> > for i in tags1.split(' '):
> > for j in tags2.split(' '):
> > if (i == j):
> > return True
> > return False
> Puestos a hacer optimizaciones, ¿no te parece un poco ineficiente
> hacer el split para convertir la cadena de los tags a una lista una y
> otra vez en la función compare? Pero bueno, tampoco hay que ponerse
> estricto ahí, a mi usar un set para almacenar los tags me parecería
> apropiado. En vez del bucle anidado de la función compare, la cosa se
> podría quedar en:
> if set_a & set_b:
> trazar_linea(a, b)
>
> Esta última propuesta no sería la más óptima en rendimiento.
> Necesitaría extraer la unión de los dos conjuntos y no se detendría al
> encontrar el primero en común. Pero me gusta porque es bastante
> concisa y legible. Aunque siempre se puede seguir usando los bucles
> anidados con las listas, que tambien son iterables.
>
> Saludos:
>
> Javi
Yo usaría diccionarios, que ya están optimizados para buscar los
índices, por lo que sólo sería necesario iterar sobre uno de ellos hasta
encontrar coincidencia.
Sean tags1 y tags2 así tags1 = {'word1':true, word2':true....}
def compare(tags1, tags2):
for key in tags1:
if key in tags2:
return True
return False
Ahora para no tener que tocar el resto del código,
sean tags1 y tags2 asi tags1 = 'word1 word2 ...'
def compare(tags1, tags2):
tags1 = dict([(tag,True) for tag in tags1.split(' ')])
tags2 = dict([(tag,True) for tag in tags2.split(' ')])
for key in tags1:
if key in tags2:
return True
return False
Más información sobre la lista de distribución Python-es