Busqueda Parcial con Tuplas como Clave de Diccionario
Alejandro Novo
alejandro.novo en gmail.com
Mar Jul 25 13:35:02 CEST 2006
Lo primero gracias por las respuestas, he aprendido mucho con ellas, sobre
todo con las list comprenhension de python, que son realmente útiles y
elegantes :)
Después de probar las soluciones que me planteabais he optado por esta
solución:
for x in d:
e, lx = x
try:
dAux[lx].append(d[x])
except KeyError:
dAux[lx] = [d[x]]
Como recordareis el principal problema que tenía era el tamaño del
diccionario. Con las solución que yo había planteado, lo que hacía era
recorrer n veces (siendo n el tamaño de la lista de claves) el diccionario
entero, lo que hacía incrementar el tiempo del proceso.
Ahora lo que hago es recorrer únicamente 1 vez el diccionario, agilizando en
gran medida el tiempo y rebajando el coste de la operación.
Me han venido genial vuestros aportes para "jugar" con las posibilidades que
me da python, y espero poder aplicarlas en adelante.
De nuevo gracias.
Un saludo
> Alejandro,
>
> Primero, tu bucle quedaría mucho más compacto usando una list
> comprehension:
>
> dAux = {}
> for lx in l:
> dAux[lx] = [d[x] for x in d if lx in x]
>
> En cuanto a velocidad, seguramente así vaya un poco más rápido, pero la
> diferencia no será sustancial. Si quieres que realmente vaya mucho más
> rápido,
> tendrías que generar estructuras auxiliares antes de la búsqueda. Por
> ejemplo,
> podrías generar este diccionario:
>
> de {('a', 'b'): ['1', '2', '3']} ...
>
> podrías sacar {'a': ['1', '2', '3'] 'b': ['1', '2', '3'] ... }
>
> y luego, al recorrer este diccionario la búsqueda sería seguro mucho más
> ágil.
>
> La forma de encarar el problema depende de muchas cosas, de la naturaleza
> de los
> datos, cuándo los obtienes, si estos se van modificando o son estáticos,
> etc.
> Pero al final, la idea es básicamente la misma, trata tus datos antes de
> entrar
> en el algoritmo de búsqueda.
>
> nos cuentas
>
> arnau
>
> ------------------------------------------------------------------------------------------------------------
>
> Dependiendo de los datos que tengas esto podria ser mas rapido:
>
> l = dict.fromkeys(l)
> for elem in d:
> for elem2 in elem:
> if elem2 in l:
> dAux.setdefault(elem2, []).append(d[elem])
>
>
> obtienes dos beneficios:
>
> * evitas iterar sobre *toda* la lista l en cada iteracion del bucle
> externo
>
> * al convertir l en un diccionario la comprobacion 'elem2 in l' se
> calcula en tiempo constante.
>
>
> si la longitud media de las claves es menor que la longitud de l este
> algoritmo sera mas rapido.
>
>
> Otra cosa, es posible que una clave contenga dos elementos de l, por
> ejemplo ('b', 'd')? Si la respuesta es 'no' podrias forzar la
> finalizacion del bucle interno con un break una vez verificado que elem2
> esta en l.
>
>
>
>
> Saludos
> --
> ^X^C
>
> Alexis Roda
> Universitat Rovira i Virgili
> Reus, Tarragona (Spain)
>
Más información sobre la lista de distribución Python-es