¿Cómo obtengo una matriz vacía de cualquier tamaño en Python?

120

Básicamente quiero un equivalente de python de esto en C:

int a[x];

pero en Python declaro una matriz como:

a = []

y el problema es que quiero asignar ranuras aleatorias con valores como:

a[4] = 1

pero no puedo hacer eso con Python, ya que la matriz está vacía.

usuario299648
fuente

Respuestas:

239

Si por "matriz" realmente te refieres a una lista de Python, puedes usar

a = [0] * 10

o

a = [None] * 10
Sven Marnach
fuente
91
Una cosa con la que debe tener cuidado a = [obj] * Nes que el mismo obj aparece en cada elemento de la matriz. Si es un objeto mutable y modifica un elemento, todo se cambiará. ... Pero, para este ejemplo usando números enteros (o cualquier otro tipo inmutable), no hace ninguna diferencia. O, si solo asigna elementos, tampoco es un problema. (Lo menciono porque he hecho exactamente eso con demasiada frecuencia :))
dappawit
4
Eso me mordió duro en mi primer proyecto Python, @dappawit. Preste atención a esta advertencia.
The Nate
crea la misma referencia para los objetos
Amr Alaa
22

No puedes hacer exactamente lo que quieres en Python (si te leo correctamente). Debe ingresar valores para cada elemento de la lista (o como lo llamó, matriz).

Pero intente esto:

a = [0 for x in range(N)]  # N = size of list you want
a[i] = 5  # as long as i < N, you're okay

Para listas de otros tipos, use algo además de 0. también Nonesuele ser una buena opción.

dappawit
fuente
2
Esta respuesta roza lo incorrecto. range(N)ya producirá una lista si Python <3.0.
Apalala
1
Es cierto que producirá una lista. Si le preocupa la eficiencia, puede usar xrange(N)Python 2.x. Sin embargo, no estoy seguro de cómo está al borde de lo incorrecto. Lo prefiero a = range(N)porque cada elemento comienza con un "predeterminado" sensato. Supongo que es cuestión de opinión.
dappawit
16

Puedes usar numpy:

import numpy as np

Ejemplo de matriz vacía :

np.empty([2, 2])
array([[ -9.74499359e+001,   6.69583040e-309],
       [  2.13182611e-314,   3.06959433e-309]])  
DanielTheRocketMan
fuente
7

Simplemente declare la lista y agregue cada elemento. Por ejemplo:

a = []
a.append('first item')
a.append('second item')
Lyle
fuente
5
¿Cómo podría entonces 'asignar espacios aleatorios'
Tdelang
5

también puede ampliar eso con el método de extensión de lista.

a= []
a.extend([None]*10)
a.extend([None]*20)
Pitonias
fuente
1

Si usted (u otros buscadores de esta pregunta) estaban realmente interesados ​​en crear una matriz contigua para llenar con números enteros, considere bytearray y memoryivew :

# cast() is available starting Python 3.3
size = 10**6 
ints = memoryview(bytearray(size)).cast('i') 

ints.contiguous, ints.itemsize, ints.shape
# (True, 4, (250000,))

ints[0]
# 0

ints[0] = 16
ints[0]
# 16
Arrendajo
fuente
1
x=[]
for i in range(0,5):
    x.append(i)
    print(x[i])
Akshar Patel
fuente
2
Si bien este código puede resolver la pregunta, incluir una explicación de cómo y por qué esto resuelve el problema realmente ayudaría a mejorar la calidad de su publicación y probablemente resultaría en más votos a favor. Recuerde que está respondiendo la pregunta a los lectores en el futuro, no solo a la persona que pregunta ahora. Por favor, editar su respuesta para agregar explicaciones y dar una indicación de lo que se aplican limitaciones y supuestos.
Daniil
0

Si realmente quieres una matriz de estilo C

import array
a = array.array('i', x * [0])
a[3] = 5
try:
   [5] = 'a'
except TypeError:
   print('integers only allowed')

Tenga en cuenta que no existe el concepto de variable no inicializada en Python. Una variable es un nombre que está vinculado a un valor, por lo que ese valor debe tener algo. En el ejemplo anterior, la matriz se inicializa con ceros.

Sin embargo, esto es poco común en Python, a menos que realmente lo necesite para cosas de bajo nivel. En la mayoría de los casos, es mejor que use una lista vacía o una matriz numpy vacía, como sugieren otras respuestas.

nota azul
fuente