busqueda en diccionario, pero sin la palabra exacta

Arnau Sanchez arnau en ehas.org
Mie Ago 29 13:51:55 CEST 2007


Sebastian Martin Artaza Saade escribió:

> es mi primera pregunta en está lista y espero que no viole
> ningun tipo de regla.

Excepto ese "halla" que se te escapó, no infringes ninguna ;-)

> Lo que quiero hacer es lo siguiente:
> Tengo un diccionario de la siguiente manera:
> a = { '[0,0,0,2,2,2,2,2,2]' :[0,1,0],  '[0,2,1,2,2,2,2,2,2]' :[1,1,0],
> '[0,1,2,2,2,2,2,2,2]' :[0,0,1],   '[1,2,2,1,0,0,0,0,0]' :[0,1,0],
> '[1,2,2,1,0,0,0,1,0]' :[1,1,0],
> '[1,2,2,1,0,0,1,0,0]' :[0,0,0],   '[1,2,2,1,0,0,1,0,1]' :[0,0,1],
> '[1,2,2,1,0,1,0,1,0]' :[1,1,1]  }

Lo primero que te diría es que cocines las claves, como cadena son 
inmanejables. A mano, sin recurrir a eval, quedaría:

str2tuple = lambda s: tuple(map(int, s[1:-1].split(",")))

'[0,1,2,2,2,2,2,2,2]' -> (0,1,2,2,2,2,2,2,2)

> quiero consultar el diccionario y donde en la clave halla un 2, lo tome como
> indiferente, por ejemplo si consulto cual es el significado de
> '[1,0,0,1,0,1,0,1,0]' me de [1,1,1], debido que en el diccionario está el
> elemento '[1,2,2,1,0,1,0,1,0]'

Un diccionario estándar no te es de gran ayuda en este caso, no entiende
eso de "indiferente". Una posible solución, asumiendo que no queramos
usar numpy o librerías similares, sería:

def doop(op, *argslst):
   """Apply operation to zipped arguments"""
   return tuple(op(*args) for args in zip(*argslst))

def get(table, key, ignore=2):
   def mask(mask0, values0):
     _mask = lambda m, v: (m == ignore) and m or v
     return doop(_mask, mask0, values0)
   for k, v in table.iteritems():
     if mask(k, key) == k:
       return v

table = {(0, 1, 2, 0): 0, (2, 2, 1, 1): 1}
print get(table, (0, 1, 1, 0)) # 0
print get(table, (1, 0, 1, 1)) # 1




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