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