logo

Pitón | Usar matrices/listas 2D de la manera correcta

Pitón proporciona poderosas estructuras de datos llamadas listas, que pueden almacenar y manipular colecciones de elementos. También proporciona muchas formas de crear listas/matrices bidimensionales. Sin embargo, es necesario conocer las diferencias entre estas formas porque pueden crear complicaciones en el código que pueden ser muy difíciles de rastrear. En este artículo, exploraremos la forma correcta de usar matrices/listas 2D en Python.

Usar matrices/listas 2D de la manera correcta

El uso correcto de matrices/listas 2D implica comprender la estructura, acceder a los elementos y manipular datos de manera eficiente en una cuadrícula bidimensional. Cuando se trabaja con datos estructurados o cuadrículas, las matrices o listas 2D pueden resultar útiles. Una matriz 2D es esencialmente una lista de listas, que representa una estructura similar a una tabla con filas y columnas.



Creando una lista 1-D

En Python, inicializar una colección de elementos en una secuencia lineal requiere crear una matriz 1D, que es un proceso fundamental. Aunque Python no tiene una estructura de datos incorporada llamada 'matriz 1D', podemos usar una lista que puede lograr la misma funcionalidad. Las listas de Python son dinámicas y versátiles, lo que las convierte en una excelente opción para representar matrices 1D. Comencemos viendo formas comunes de crear una matriz 1d de tamaño N inicializada con 0.

Crear una lista 1D usando métodos ingenuos

Inicializar y completar manualmente una lista sin utilizar funciones o construcciones avanzadas en Python se conoce como crear una lista 1D utilizando métodos ingenuos.

Python3








N>=> 5> ar>=> [>0>]>*>N> print>(ar)>

>

>

Producción

[0, 0, 0, 0, 0]>

Crear una lista 1D usando la comprensión de listas

Aquí estamos multiplicando el número de filas por la lista vacía y, por lo tanto, se crea la lista completa con cada elemento cero.

Python3




N>=> 5> arr>=> [>0> for> i>in> range>(N)]> print>(arr)>

>

edad de dharmendra
>

Producción

[0, 0, 0, 0, 0]>

Creando una lista 2-D

El uso correcto de matrices/listas 2D implica comprender la estructura, acceder a los elementos y manipular datos de manera eficiente en una cuadrícula bidimensional. Al dominar el uso de matrices 2D, puede mejorar significativamente su capacidad para manejar datos complejos y realizar diversas operaciones de manera eficiente.

Creando una lista 2D usando Método ingenuo

Aquí estamos multiplicando el número de columnas y, por lo tanto, obtenemos la lista 1-D de tamaño igual al número de columnas y luego la multiplicamos por el número de filas, lo que da como resultado la creación de una lista 2-D.

Python3




rows, cols>=> (>5>,>5>)> arr>=> [[>0>]>*>cols]>*>rows> print>(arr)>

>

>

Producción

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]>

Nota: El uso de este método a veces puede provocar comportamientos inesperados. En este método, cada fila hará referencia a la misma columna. Esto significa que, incluso si actualizamos solo un elemento de la matriz, actualizará la misma columna en nuestra matriz.

Pitón




rows, cols>=> (>5>,>5>)> arr>=> [[>0>]>*>cols]>*>rows> print>(arr,>'before'>)> arr[>0>][>0>]>=> 1> # update only one element> print>(arr,>'after'>)>

>

>

Producción

([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]], 'before') ([[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]], 'after')>

Creando una lista 1D usando Comprensión de listas

Aquí básicamente usamos el concepto de comprensión de listas y aplicamos un bucle para una lista dentro de una lista y, por lo tanto, creamos una lista 2-D.

Python3


suma numerosa



rows, cols>=> (>5>,>5>)> arr>=> [[>0> for> i>in> range>(cols)]>for> j>in> range>(rows)]> print>(arr)>

>

>

Producción

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]>

Creando una lista 1D usando Lista vacía

Aquí agregamos ceros como elementos para varias columnas y luego agregamos esta lista 1-D a la lista de filas vacías y, por lo tanto, creamos la lista 2-D.

Python3




arr>=>[]> rows, cols>=>5>,>5> for> i>in> range>(rows):> >col>=> []> >for> j>in> range>(cols):> >col.append(>0>)> >arr.append(col)> print>(arr)>

>

>

Producción

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]>

Inicializando matriz 2D

El código proporcionado demuestra dos enfoques diferentes para inicializar una matriz 2D en Pitón . Primero, la matrizarr>se inicializa usando una lista de comprensión 2D, donde cada fila se crea como[0, 0, 0, 0, 0]>. La matriz completa se crea como una lista de referencias a la misma lista interna, lo que genera un alias. Cualquier cambio realizado en un elemento en una fila se reflejará en todas las filas. Luego, el código muestra otro enfoque que utiliza una lista de comprensión anidada para crear la matriz 2D.arr>. Este método evita el alias creando una nueva lista para cada fila, lo que da como resultado una matriz 2D adecuada.

Python3




# Python 3 program to demonstrate working> # of method 1 and method 2.> rows, cols>=> (>5>,>5>)> # method 2 1st approach> arr>=> [[>0>]>*>cols]>*>rows> # lets change the first element of the> # first row to 1 and print the array> arr[>0>][>0>]>=> 1> for> row>in> arr:> >print>(row)> # method 2 2nd approach> arr>=> [[>0> for> i>in> range>(cols)]>for> j>in> range>(rows)]> # again in this new array lets change> # the first element of the first row> # to 1 and print the array> arr[>0>][>0>]>=> 1> for> row>in> arr:> >print>(row)>

>

>

Producción

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

Explicación:

Esperamos que solo el primer elemento de la primera fila cambie a 1, pero el primer elemento de cada fila cambia a 1 en el método 2a. Este peculiar funcionamiento se debe a que Python utiliza listas superficiales que intentaremos comprender.
En el método 1a, Python no crea 5 objetos enteros, sino que crea solo un objeto entero, y todos los índices de la matriz apuntan al mismo objeto int como se muestra.

Si asignamos el índice 0 a otro número entero, digamos 1, entonces se crea un nuevo objeto entero con el valor de 1 y luego el índice 0 ahora apunta a este nuevo objeto int como se muestra a continuación.

De manera similar, cuando creamos una matriz 2D como arr = [[0]*cols]*rows, esencialmente estamos ampliando la analogía anterior.

  1. Sólo se crea un objeto entero.
  2. Se crea una única lista 1d y todos sus índices apuntan al mismo objeto int en el punto 1.
  3. Ahora, arreglo[0], arreglo[1], arreglo[2]…. arr[n-1] todos apuntan al mismo objeto de lista anterior en el punto 2.

La configuración anterior se puede visualizar en la imagen a continuación.

Ahora cambiemos el primer elemento en la primera fila de arr como arr[0][0] = 1

  • arr[0] apunta al objeto de lista único que creamos arriba. (Recuerde que arr[1], arr[2]…arr[n-1] también apuntan al mismo objeto de lista).
  • La asignación de arr[0][0] creará un nuevo objeto int con el valor 1 y arr[0][0] ahora apuntará a este nuevo objeto int. (y también lo hará arr[1][0], arr [2][0] … arreglo[n-1][0])

Esto se puede ver claramente en la imagen de abajo.

Entonces, cuando se crean matrices 2D de esta manera, cambiar los valores en una determinada fila afectará a todas las filas, ya que esencialmente solo hay un objeto entero y solo un objeto de lista al que hacen referencia todas las filas de la matriz.

Como era de esperar, es difícil rastrear los errores causados ​​por el uso de listas poco profundas. Por lo tanto, la mejor manera de declarar una matriz 2D es

Python3




rows, cols>=> (>5>,>5>)> print>([[>0> for> i>in> range>(cols)]>for> j>in> range>(rows)])>

>

>

Producción

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]>

Este método crea 5 objetos de lista separados, a diferencia del método 2a. Una forma de comprobar esto es utilizar el operador 'is', que comprueba si los dos operandos se refieren al mismo objeto.

binario a bcd

Python3




rows, cols>=> (>5>,>5>)> # method 2 2nd approach> arr>=> [[>0> for> i>in> range>(cols)]>for> j>in> range>(rows)]> # check if arr[0] and arr[1] refer to> # the same object> print>(arr[>0>]>is> arr[>1>])># prints False> # method 2 1st approach> arr>=> [[>0>]>*>cols]>*>rows> # check if arr[0] and arr[1] refer to the same object prints True because there is only one> #list object being created.> print>(arr[>0>]>is> arr[>1>])>

>

>

Producción

False True>