Busqueda Parcial con Tuplas como Clave de Diccionario

Chema Cortes pych3m4 en gmail.com
Vie Jul 21 20:04:20 CEST 2006


El 2006/7/21, Alejandro Novo <alejandro.novo en gmail.com> escribió:

> 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) 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])
>
> Lo que me revolvería lo que busco:
>
> dAux = {'b': [['1', '2', '3']], 'd': [['5', '6', '7']], 'f': [['8', '9',
> '10'], ['11', '12', '13']]}
>
> Pero esta forma es lentísima para mi caso, donde los diccionarios son de
> tamaño considerable, así como la lista.

No me hago a la idea para qué quieres ésto y puede que no te resuelva
nada, pero ante la situación que planteas yo lo haría así:

dAux_iter=( (y,v) for ((x,y),v) in d.items() if y in l)

Usando este iterador no necesitarías crear un nuevo diccionario, algo
que se agradece si se tratan de grandes diccionarios. Si no te sirve,
es fácil generar el diccionario auxiliar:

dAux=dict(dAux_iter)




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