Python - Cambiar elemento en una lista de listas

 
Vista:
sin imagen de perfil

Cambiar elemento en una lista de listas

Publicado por Guillermo (12 intervenciones) el 07/05/2017 20:35:24
Hola. Estoy operando con matrices en una lista de listas, es decir, A=[[0,0,0],[0,0,0],[0,0,0]] sería una matriz 3x3 de ceros. Quiero cambiar el elemento 1,1 de la matriz por un 1, que en coordenadas de python sería el elemento A[0][0].
Sin embargo cuando pongo el código:
A[0][0]=1, la matriz A ahora es A=[[1,0,0],[1,0,0],[1,0,0]] en lugar de A=[[1,0,0],[0,0,0],[0,0,0]].
Querría saber por qué esto es así y también saber si hay algún método de las listas rápido para hacer esto.
Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Cambiar elemento en una lista de listas

Publicado por kip (257 intervenciones) el 07/05/2017 20:40:56
Hola, es raro lo que te sucede, he probado este codigo:

1
2
3
A=[[0,0,0],[0,0,0],[0,0,0]]
A[0][0]=1
print (A)

Y el resultado es el que esperas, se modifica el primer elemento de la primera matriz:

1
[[1, 0, 0], [0, 0, 0], [0, 0, 0]]

Nos podrias decir donde estas ejecutando el codigo ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Cambiar elemento en una lista de listas

Publicado por Guillermo (12 intervenciones) el 07/05/2017 21:27:52
Uso pyscrypter y tengo instalado python 3.2. Creo que voy a reinstalarlo a ver que es lo que sucede, tal vez sea algún bug pero es muy extraño
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Cambiar elemento en una lista de listas

Publicado por Guillermo (12 intervenciones) el 07/05/2017 21:51:30
Poniendo tu código funciona. Ahora, yo esto lo estoy utilizando para ejecutar el siguiente código, que me dará una matriz de 0 con la diagonal de la matriz A, entrada de una función. Dejo aquí el código:

1
2
3
4
5
6
7
8
9
10
11
12
A=[[1,2,3],[4,5,6],[7,8,9]]
def diag(A):
#creamos una matriz de ceros con la misma dimension de A
    diag=[[0]*len(A)]*len(A)
#iniciamos un bucle para cambiar la diagonal
    for i in range (len(A)):
#intercambiamos terminos
        diag[i][i]=A[i][i]
#devolvemos la matriz
    return diag
z=diag(A)
print(z)



El resultado me dice que es [[1, 5, 9], [1, 5, 9], [1, 5, 9]]. Este problema lo tuve antes pero creía que podía ser por cualquier otra cosa del código y no le di mayor importancia. Ahora no se que hago mal y me gustaría mucho arreglarlo :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Cambiar elemento en una lista de listas

Publicado por kip (257 intervenciones) el 08/05/2017 02:31:50
Hola, en realidad no tienes problema con la logica de resolucion del problema, si no mas bien en la creacion de la lista con 0's a partir del tamaño de la que envias a la funcion.

Cuando haces esto:

1
diag=[[0]*len(A)]*len(A)

Sobre todo en ]*len(A) lo que haces es crear la misma lista la cantidad de veces que tenga el tamaño de la lista que recibes, cuando digo la misma quiere decir que estas tendran una referencia en comun por asi decirlo entre ellas:

1
2
diag=[[0]*len(A)]*len(A)
diag[0][0] = 1

De esa forma deberia modificar el primer elemento de la primera lista no ? Y si, eso hace, pero como creaste las listas como una copia exacta entonces si se modifica el primer elemento, se modificaran los primeros de las otras.

Quizas para crear una lista de 0's y basandose en el tamaño de otra lista podrias usar un for, algo asi:

1
nlista=[[0] * len(lista) for i in range (len(lista))]

O tal vez para entender mejor algo asi:

1
2
3
nlista = []
for i in range (len(lista)):
    nlista.append([0] * len(lista))

Prueba y nos avisas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Cambiar elemento en una lista de listas

Publicado por Guillermo (12 intervenciones) el 08/05/2017 12:02:47
Funciona! Gracias, no conocía esta propiedad de las listas :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar