busqueda en diccionario, pero sin la palabra exacta

Chema Cortes pych3m4 en gmail.com
Jue Ago 30 03:57:45 CEST 2007


El 28/08/07, Sebastian Martin Artaza Saade <martin.artaza en gmail.com> escribió:
> Hola que tal, es la mi primera pregunta en está lista y espero que no viole
> ningun tipo de regla.
> 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]  }
> ese diccionario es la tabla de control de un alu del mips simplificado,
> bueno no viene al caso, lo que necesito es:
>
> 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]'  (el ultimo) y lo que pregunte es igual salvo
> en los elemento que hay un 2, no se si me explico, otro ejemplo si vemos el
> primer elemento empieza con 0,0,0 y despues es todo 2, si yo pregunto por
> '[0,0,0,(cualquiercosa)]' me de [0,1,0]. Lo que si tiene que ser igual es
> los 1 y los 0 el 2 es el unico indiferente.

La solución de Arnau creo que coincide con lo que pides, tal vez
usando una función de comparación tal que así:

def mip_cmp(a,b):
	def _cmp(i,j):
		if i==2 or j==2: return True
		else: return i==j

	return False not in [_cmp(i,j) for (i,j) in zip(a,b)]


De todos modos, lo que quieres hacer se suele implementar (casi
siempre) con un par de números en binario, donde uno de ellos hace de
máscara:

[0,0,0,2,2,2,2,2,2] -->  (int("000111111",2),int("000111111",2))  ==(n,mask)
[0,2,1,2,2,2,2,2,2] -->  (int("011111111",2),int("010111111",2))
[0,1,2,2,2,2,2,2,2] -->  (int("011111111",2),int("001111111",2))

Donde se cumple que n&mask==mask


De esta manera tendríamos...:

tabla = (
 (0x03f,  0x03f,  [0,1,0]),
 (0x0ff,   0x0bf,  [1,1,0]),
 (0x0ff,   0x07f,  [0,0,1]),
 (0x1e0, 0x0c0, [0,1,0]),
 (0x1e2, 0x0c0, [1,1,0]),
 (0x1e4, 0x0c0, [0,0,0]),
 (0x1e5, 0x0c0, [0,0,1]),
 (0x1ea, 0x0c0, [1,1,1])
)

def resultado(item):
  for n,mask,res in tabla:
    if (item|mask)==n:
      return res
  raise LookupError




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