Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: evanescense en 14 Junio 2016, 00:31 am



Título: [Consulta] Índice en listas anidadas (Python)
Publicado por: evanescense en 14 Junio 2016, 00:31 am
Buenos días a todos, quería hacerles una consulta. Estoy aprendiendo Python y tengo que hacer un programa que evalue la distancia entre dos elementos en una grilla. Se le pide al usuario que ingrese dos números, y el programa calcularía la distancia entre ellos con el Teorema de Pitágoras (suponemos la distancia entre dos elementos adyacentes horizontal o verticalmente es 1)

Ahora, el problema aparece porque si yo creo una lista con listas anidadas (algo como miLista = [[1, 2], [3, 4]]) y utilizo el método miLista.index(3), el método no arroja resultados porque está anidada. ¿Existe alguna forma de lograr sacar el índice del elemento para asignarle unas cordenadas y así poder calcular la distancia?

Muchas gracias por vuestra ayuda. Saludos

1 2 3
4 5 6
7 8 9


Título: Re: [Consulta] Índice en listas anidadas (Python)
Publicado por: tincopasan en 14 Junio 2016, 04:19 am
en principio está bien tu deducción, lo que te faltó es que en las listas anidadas para cada item hay un doble indice, algo así:
Código
  1. miLista = [[1, 2], [3, 4]]
  2.  
  3. elemento0=miLista[0][0]
  4. elemento4=miLista[1][1]
  5. print(elemento0)
  6. print(elemento4)

espero que se entienda.


Título: Re: [Consulta] Índice en listas anidadas (Python)
Publicado por: evanescense en 14 Junio 2016, 04:55 am
Buenos días tincopasan, antes que nada, muchas gracias por tu respuesta. Sí, se entendió muy bien lo que me dijiste. El tema es que, aunque sí puedo acceder a determinado elemento en la lista anidada si conozco su índice, el problema me apareció cuando yo conozco el elemento, pero no su índice.

Aquí pongo el resultado que me arroja el IDLE cuando creo una lista así y utilizo el método index en ella:


Código:
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:38:48) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> miLista = [1,2,3]
>>> miLista.index(3)
2
>>> miListaAnidada = [[1, 2], [3, 4]]
>>> miListaAnidada.index(3)
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    miListaAnidada.index(3)
ValueError: 3 is not in list
>>>

Recién estuve charlando con un amigo sobre esto y me recomendó que chequee si el elemento en cuestión está dentro de cada una de las sublistas con un ciclo for, aunque sería una lástima que no haya un procedimiento más simple


Título: Re: [Consulta] Índice en listas anidadas (Python)
Publicado por: tincopasan en 14 Junio 2016, 06:45 am
efectivamente, sino tenés la menor idea en cual sublista se encuentra el item, deberás recorrerla con un for, ahora, si sabés en que sublista puede estar es más fácil:
Código
  1. lista=[[1,2,6,4,5],[7,8,9,10]]
  2. print(lista[1].index(9))
  3.  
que es lo que te dije antes de los índices, desconozco si hay una función más simple sin el for en el caso de tener que recorrer la lista y sublistas.


Título: Re: [Consulta] Índice en listas anidadas (Python)
Publicado por: peter_lyon en 25 Junio 2016, 03:59 am
La función index va a buscar el elemento tal cual en la lista.
En python no existe como tal el concepto de lista anidada, una lista puede contener cualquier cosa, incluso listas, pero no deja de ser una lista como otra cualquiera.

Si tienes por ejemplo
miLista = [[1, 2], [3, 4]]

index solo te va a funcionar con:

miLista.index([1,2])   y   miLlista.index([3,4])


La solución es un poco compleja, pero de eso se trata, de ir aprendiendo y avanzando para llegar a ser un buen programador, no debes tener miedo a usar instrucciones más potentes, como "for" o "in" que son instrucciones con una semántica muy parecida al lenguaje natural (una de las grandes ventajas de python) y puedes llegar a hacer grandes cosas con ellas:

def indices(lista, elm):
  for fila in lista: # para cada fila en la lista
    if elm in fila:   # Si el elmento (elm) está en esta fila
      return ( lista.index(fila) ,  fila.index(elm) ) # Devolvemos una tupla de dos elementos, la posición de la fila dentro de la grilla,
                          # y la posición del elm en la fila (columna).
  return (None, None) # Si no la encontramos en ninguna fila devolvemos una tupla con 2 elementos nulos.


Aunque ahora te pueda parecer complicado, leelo con calma, entiéndelo, puedes copiarlo y pegarlo tal cual en tu consola python y funcionará. Es muy importante que lo entiendas, si no no sirve para nada, si no entiendes algo pregúntame.

Si te das cuenta han bastado 5 líneas de código para definir una función que encuentra los 2 índices de un elemento en una matriz y si no los encuentra devuelve valores nulos. Además la sintaxis parece seudocódigo y es muy fácil de entender comparado con otros lenguajes.