Busqueda Parcial con Tuplas como Clave de Diccionario

SER.RI-TIC-Alexis Roda alexis.roda en urv.net
Vie Jul 21 12:44:53 CEST 2006


Alejandro Novo wrote:
> Buenos días,
> 
> en mi caso tengo una lista y un diccionario, donde el diccionario tiene 
> como
> claves una tupla. Cada tupla solo tiene un elemento relevante para mi
> búsqueda (el 2º como podéis ver en la lista ejemplo)

siempre es el segundo o solo en el ejemplo? si siempre es el segundo 
puedes evitar el segundo for, definiendo elem2 = elem[1]

  y lo que necesito es
> recorrer el diccionario y recoger todos los valores donde el elemento de mi
> lista inicial aparezca en la clave. Por ejemplo:
> 
> d = {('a', 'b'): ['1', '2', '3'], ('e', 'f'): ['8', '9', '10'], ('z', 'f'):
> ['11', '12', '13'], ('c', 'd'): ['5', '6', '7']}
> l = ['b', 'd', 'f']
> 
> for elem in d:
>    for elem2 in l:
>        if elem2 in elem:
>            if elem2 not in dAux:
>                dAux[elem2]=[]
>                dAux[elem2].append(d[elem])
>            else:
>                dAux[elem2].append(d[elem])

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