[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