Busca en una lista bidimensional sin números.

Estoy buscando definir una función que acepte dos parámetros: un int y una list .

Si la función encuentra el entero en la lista, devuelve sus coordenadas .

Por ejemplo, ¿cómo haría eso para el número 4 en la siguiente lista, sin usar numpy ?

 l = [ [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 1, 1, 0, 1, 1, 1, 0], [0, 1, 0, 1, 0, 0, 0, 1, 0], [0, 1, 0, 1, 1, 1, 0, 1, 0], [0, 1, 0, 0, 0, 1, 0, 1, 0], [0, 1, 1, 1, 0, 1, 0, 1, 0], [0, 0, 0, 1, 0, 1, 0, 1, 0], [0, 1, 1, 1, 0, 1, 0, 1, 0], [0, 1, 0, 0, 0, 0, 0, 1, 0], [0, 1, 0, 1, 1, 1, 0, 1, 0], [0, 1, 0, 1, 0, 1, 0, 1, 0], [0, 1, 1, 1, 0, 1, 1, 4, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0] ] 

Puede asumir que el objective siempre aparecerá solo una vez y siempre estará incluido en la lista.

Related of "Busca en una lista bidimensional sin números."

Puedes hacer algo como esto:

 l = [ [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 1, 1, 0, 1, 1, 1, 0], [0, 1, 0, 1, 0, 0, 0, 1, 0], [0, 1, 0, 1, 1, 1, 0, 1, 0], [0, 1, 0, 0, 0, 1, 0, 1, 0], [0, 1, 1, 1, 0, 1, 0, 1, 0], [0, 0, 0, 1, 0, 1, 0, 1, 0], [0, 1, 1, 1, 0, 1, 0, 1, 0], [0, 1, 0, 0, 0, 0, 0, 1, 0], [0, 1, 0, 1, 1, 1, 0, 1, 0], [0, 1, 0, 1, 0, 1, 0, 1, 0], [0, 1, 1, 1, 0, 1, 1, 4, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0] ] def findElement(element, l): for i in range(len(l)): for j in range(len(l[i])): if element==l[i][j]: return (i,j) return None print(findElement(4,l)) 

Salida:

 (11, 7) 

El objective siempre aparecerá solo una vez y siempre estará incluido en la lista

Puede utilizar enumerate para enumerar las listas externas y los elementos de las listas internas.

 def coords(lst, find): return next((i, j) for i, sub in enumerate(lst) for j, x in enumerate(sub) if x == find) 

Demo con su lista l :

 >>> coords(l, 2) >>> (1, 1) >>> coords(l, 1) >>> (1, 2) 

En caso de que luego desee adaptar la función para que funcione correctamente si el objective no está en la lista, recuerde que a next toma un argumento default opcional.

Yo usaría una solución como esta:

 #!/usr/bin/env ipython # --------------------- l = [ [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 1, 1, 0, 1, 1, 1, 0], [0, 1, 0, 1, 0, 0, 0, 1, 0], [0, 1, 0, 1, 1, 1, 0, 1, 0], [0, 1, 0, 0, 0, 1, 0, 1, 0], [0, 1, 1, 1, 0, 1, 0, 1, 0], [0, 0, 0, 1, 0, 1, 0, 1, 0], [0, 1, 1, 1, 0, 1, 0, 1, 0], [0, 1, 0, 0, 0, 0, 0, 1, 0], [0, 1, 0, 1, 1, 1, 0, 1, 0], [0, 1, 0, 1, 0, 1, 0, 1, 0], [0, 1, 1, 1, 0, 1, 1, 4, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0] ] # ---------------------------------- def search(value,listin): coords = [[ival,kkval] for ival,dd in enumerate(listin) for kkval,val in enumerate(dd) if val==value] return coords # ---------------------------------- result = search(4,l) print result 

donde definí una función de búsqueda, que se puede usar para buscar cierto valor en una lista de entrada.

Aquí está mi enfoque:

 def matrix_search(target, matrix): for row_index, row in enumerate(matrix): try: return (row_index, row.index(target)) except ValueError: pass raise ValueError('Target {} not found'.format(target)) 

Uso de la muestra:

 print(matrix_search(4, l)) 

Notas

  • Para buscar una lista simple, use el método .index()
  • El método .index() devolverá el índice del elemento si se encuentra o lanzará un ValueError si no se encuentra. En nuestro contexto, simplemente ignoramos esta excepción y pasamos a la siguiente fila.
  • Al final del bucle, lanzaremos una excepción porque el elemento no se encuentra