Inicializar una matriz de tamaño fijo en Python [duplicate]

7 minutos de lectura

avatar de usuario
kbb

Me gustaría saber cómo puedo inicializar una matriz (o lista), aún sin llenar con valores, para tener un tamaño definido.

Por ejemplo en C:

int x[5]; /* declared without adding elements*/

¿Cómo hago eso en Python?

  • Todos estos: stackoverflow.com/search?q=%5Bpython%5D+array+of+fixed+size.

    – S. Lott

    26 mayo 2011 a las 17:38

  • posible duplicado de Python, forzando una lista a un tamaño fijo O tal vez esto: stackoverflow.com/questions/4056768/…

    – S. Lott

    26 mayo 2011 a las 17:38


  • La pregunta más interesante es por qué quieres hacer esto. La mayoría de las situaciones en las que he visto que esto es necesario se deben a malas decisiones.

    – Noufal Ibrahim

    26 mayo 2011 a las 17:40

  • Casi nunca necesitas esto. En el 99% de los casos, puede generar los valores de una sola vez, por ejemplo, utilizando una lista de comprensión, o simplemente comienza con [] y .append() o .expand() en un while bucle o algo así (las listas se están sobreasignando, por lo que el cambio de tamaño se amortiza O (1)).

    usuario395760

    26 mayo 2011 a las 17:41

  • Debe explicar su motivación para necesitar esto. ¿Actuación? ¿Seguridad? ¿Interactuar con C/C++/NumPy/…?

    – smci

    9 de febrero de 2012 a las 23:25

Puedes usar:

>>> lst = [None] * 5
>>> lst
[None, None, None, None, None]

  • La pregunta especificaba “… aún no se ha rellenado con valores”. Los documentos de Python indican “None se usa típicamente para representar la ausencia de un valor “. Mi ejemplo produjo una lista de este tipo del tamaño definido, en la menor cantidad de código. Es lo más parecido en Python idiomático en el momento en que se hizo la pregunta.

    – sesgo de muestra

    25 de agosto de 2014 a las 21:08

  • Esto cumple con los requisitos de la pregunta porque tiene una matriz de tamaño definida y puede indexar uno de los cinco elementos sin obtener un IndexError. Esto es lo más parecido a la expresión C.

    – usuario2233706

    26/10/2014 a las 17:43

  • @ user2233706 Estaría más cerca de C si la matriz se llenara con ceros.

    – yamex5

    25 de abril de 2020 a las 4:47

  • Puedes hacer lst = [0] * 5 es lo que quieres >>> [0]*5 [0, 0, 0, 0, 0]

    – kamayd

    10 de junio de 2020 a las 17:33


  • Una cosa a tener en cuenta: todos los elementos de la lista tendrán inicialmente la misma identificación (o dirección de memoria). Cuando cambie cualquier elemento más adelante en el código, esto afectará solo el valor especificado, SIN EMBARGO, si crea una lista de objetos personalizados de esta manera (usando el multiplicador int) y luego cambia cualquier propiedad del objeto personalizado , esto cambiará TODOS los objetos en la lista.

    – como un

    22 de enero de 2021 a las 21:59

avatar de usuario
pat morin

¿Por qué estas preguntas no se responden con la respuesta obvia?

a = numpy.empty(n, dtype=object)

Esto crea una matriz de longitud n que puede almacenar objetos. No se puede cambiar de tamaño ni agregar. En particular, no desperdicia espacio rellenando su longitud. Este es el equivalente Python de Java

Object[] a = new Object[n];

Si está realmente interesado en el rendimiento y el espacio y sabe que su matriz solo almacenará ciertos tipos numéricos, puede cambiar el argumento dtype a algún otro valor como int. Luego, numpy empaquetará estos elementos directamente en la matriz en lugar de hacer que la matriz haga referencia a objetos int.

  • Sin embargo, si hubiera sido tan obvio, alguien más lo habría proporcionado… nuevamente, importar una biblioteca solo para obtener esta funcionalidad puede no ser la mejor opción.

    – agua con hielo

    12 de marzo de 2014 a las 1:44

  • Excepto que esta es la única respuesta aquí que es realmente correcta. El OP no especificó que la carga del módulo estaba prohibida. Tampoco pidió una lista. La pregunta es muy específica y esta respuesta es correcta. +1

    – Dave

    2 de julio de 2014 a las 11:17

  • agregar un módulo grande como numpy es una sobrecarga innecesaria

    – shaw2thefloor

    28 de marzo de 2017 a las 10:58

  • ¿Puede explicar por qué la elección de dtype=object a diferencia de algunos otros dtype?

    – patrickt

    7 noviembre 2018 a las 19:45

  • Solo para aclarar, ¿esta implementación tiene el tiempo de acceso O(1) típico de una matriz en lugar del tiempo de acceso O(n) de una lista vinculada?

    – usuario8773963

    12 de enero de 2020 a las 20:34

avatar de usuario
Timo

Hacer esto:

>>> d = [ [ None for y in range( 2 ) ] for x in range( 2 ) ]
>>> d
[[None, None], [None, None]]
>>> d[0][0] = 1
>>> d
[[1, None], [None, None]]

Las otras soluciones conducirán a este tipo de problema:

>>> d = [ [ None ] * 2 ] * 2
>>> d
[[None, None], [None, None]]
>>> d[0][0] = 1
>>> d
[[1, None], [1, None]]

  • Él pregunta sobre Array no List

    – kta

    18 de junio de 2018 a las 10:07

  • Buena respuesta. El problema que mencionas me jodió en una competencia de programación. ¿Conoces la mecánica exacta debajo del capó para causar esto?

    – AL Verminburger

    12 de enero de 2020 a las 9:11

  • Python copia “tipos de datos simples y antiguos” por valor y el resto por referencia, y no siempre está claro cuándo sucede uno u otro.

    – TTimo

    13 de enero de 2020 a las 14:31


  • en caso de que alguien se pregunte, el comportamiento es (el primer multiplicador de TLDR crea n matriz de longitud, el segundo multiplicador crea una lista de las matrices de m longitud copiando la primera matriz por referencia) explicado aquí docs.python.org/2/faq/…

    – Jimson James

    2 abr 2021 a las 20:02

  • Tuve el problema exacto.

    – JinhuaWang

    21 de marzo a las 13:03

La mejor apuesta es usar el entumecido biblioteca.

from numpy import ndarray

a = ndarray((5,),int)

avatar de usuario
kaamen

>>> import numpy
>>> x = numpy.zeros((3,4))
>>> x
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])
>>> y = numpy.zeros(5)   
>>> y
array([ 0.,  0.,  0.,  0.,  0.])

x es una matriz bidimensional e y es una matriz unidimensional. Ambos se inicializan con ceros.

  • Deberías dar algún tipo de explicación…

    – David Konrad

    19 de junio de 2014 a las 19:15

avatar de usuario
Alejandro Gessler

Una solución fácil es x = [None]*lengthpero tenga en cuenta que inicializa todos los elementos de la lista para None. si el tamaño es De Verdad arreglado, puedes hacer x=[None,None,None,None,None] también. Pero estrictamente hablando, no obtendrá elementos indefinidos de ninguna manera porque esta plaga no existe en Python.

  • Deberías dar algún tipo de explicación…

    – David Konrad

    19 de junio de 2014 a las 19:15

>>> n = 5                     #length of list
>>> list = [None] * n         #populate list, length n with n entries "None"
>>> print(list)
[None, None, None, None, None]

>>> list.append(1)            #append 1 to right side of list
>>> list = list[-n:]          #redefine list as the last n elements of list
>>> print(list)
[None, None, None, None, 1]

>>> list.append(1)            #append 1 to right side of list
>>> list = list[-n:]          #redefine list as the last n elements of list
>>> print(list)
[None, None, None, 1, 1]

>>> list.append(1)            #append 1 to right side of list
>>> list = list[-n:]          #redefine list as the last n elements of list
>>> print(list)
[None, None, 1, 1, 1]

o con realmente nada en la lista para empezar:

>>> n = 5                     #length of list
>>> list = []                 # create list
>>> print(list)
[]

>>> list.append(1)            #append 1 to right side of list
>>> list = list[-n:]          #redefine list as the last n elements of list
>>> print(list)
[1]

en la cuarta iteración de append:

>>> list.append(1)            #append 1 to right side of list
>>> list = list[-n:]          #redefine list as the last n elements of list
>>> print(list)
[1,1,1,1]

5 y todos los siguientes:

>>> list.append(1)            #append 1 to right side of list
>>> list = list[-n:]          #redefine list as the last n elements of list
>>> print(list)
[1,1,1,1,1]

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad