Por alguna razón insondable, Python llama a las matrices "listas". La escuela de diseño de lenguaje "todo el mundo sabe lo que se llama así que vamos a llamarlo de otra manera". Es una elección de nombre particularmente mala, ya que parece una lista vinculada en lugar de una matriz.
Glenn Maynard el
42
@Glenn Maynard: probablemente porque en lenguajes tipo C las matrices tienen una longitud fija mientras que las listas de Python no. Es más como el vector STL en C ++ o ArrayList en Java.
MAK
128
Se llama una lista, porque es una lista. [A (), 1, 'Foo', u'öäöäö ', 67L, 5.6]. Una lista. Una matriz es "una disposición de elementos en direcciones igualmente espaciadas en la memoria de la computadora" (wikipedia).
Lennart Regebro
35
Nada sobre el término universalmente comprendido "matriz" sugiere una longitud fija o algo sobre el contenido; esas son solo limitaciones de la implementación particular de C de las matrices. Las listas de Python están igualmente espaciadas (punteros a objetos, internamente), o de lo contrario __getitem__no serían O (1).
Glenn Maynard el
24
@Glenn, de en.wikipedia.org/wiki/Array_data_structure: "los elementos de una estructura de datos de matriz deben tener el mismo tamaño" (verdadero para las matrices de Python, no es cierto para las listas de Python) y "conjunto de tuplas de índice válidas y las direcciones de los elementos (y, por lo tanto, la fórmula de direccionamiento de elementos) generalmente se fijan mientras la matriz está en uso "(no es cierto en Python para la lista o la matriz).
Alex Martelli el
Respuestas:
358
variable =[]
Ahora se variablerefiere a una lista vacía * .
Por supuesto, esta es una tarea, no una declaración. No hay forma de decir en Python "esta variable nunca debe referirse a otra cosa que no sea una lista", ya que Python se escribe dinámicamente.
* El tipo de Python incorporado predeterminado se llama una lista , no una matriz. Es un contenedor ordenado de longitud arbitraria que puede contener una colección heterogénea de objetos (sus tipos no importan y se pueden mezclar libremente). Esto no debe confundirse con el arraymódulo , que ofrece un tipo más cercano al arraytipo C ; los contenidos deben ser homogéneos (todos del mismo tipo), pero la longitud sigue siendo dinámica.
¿Sería posible inicializar el contenido de la matriz, como en JavaScript? (por ejemplo, como variable = ["Hi", "Hello"];?)
Anderson Green
66
@AndersonGreen Sí.
sepp2k
3
¿Cómo declararía una matriz multidimensional, entonces (por ejemplo, una matriz 2D?)
Anderson Green
77
@AndersonGreen Como dije, no hay una declaración variable en Python. Para ello se crea una lista multidimensional mediante la adopción de una lista vacía y poner otras listas dentro de él o, si se conocen las dimensiones de la lista en el tiempo de escritura, usted podría escribir como un literal de esta manera: my_2x2_list = [[a, b], [c, d]]. Dependiendo de para qué necesite matrices multidimensionales, también puede considerar usar numpy, que define los tipos de matrices para matrices multidimensionales, homogéneas y sin caja que pueden ser mucho más eficientes cuando corresponda, por lo que son preferibles para los cálculos numéricos.
sepp2k
1
@IfanIqbal Sí, si contiene al menos un elemento, puede hacerlo.
sepp2k
136
Este es un tema sorprendentemente complejo en Python.
Respuesta práctica
Las matrices están representadas por clase list(ver referencia y no mezclarlas con generadores ).
Vea ejemplos de uso:
# empty array
arr =[]# init with values (can contain mixed types)
arr =[1,"eels"]# get item by index (can be negative to access end of array)
arr =[1,2,3,4,5,6]
arr[0]# 1
arr[-1]# 6# get length
length = len(arr)# supports append and insert
arr.append(8)
arr.insert(6,7)
Respuesta teórica
Debajo del capó, Python listes un contenedor para una matriz real que contiene referencias a elementos. Además, la matriz subyacente se crea con algo de espacio extra.
Las consecuencias de esto son:
el acceso aleatorio es realmente barato ( arr[6653]es igual a arr[0])
append la operación es 'gratis' mientras hay espacio extra
Solo para agregar, hay una forma realmente genial de cortar matrices en python: el [1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]resultado será[2, 3, 4, 5, 6, 7]
Anton Purin
2
Veo algunos votos negativos para esta publicación de vez en cuando. Sería genial si alguien pudiera publicar una palabra por qué. Gracias.
Anton Purin
2
Eres un verdadero MVP. Necesita saber el diseño real elegido de 'lista' para tomar decisiones de programación razonables. Básicamente es como un 'vector' en C ++. ¡Gracias!
Necro
¡Esta es una respuesta muy larga con una gran explicación!
Ahmed
¿Puedo agregar la notación práctica para la comparación, por ejemplo: a == b[:2]devuelve True si los primeros 2 elementos de b son iguales a los valores de la matriz a
Bruno L.
124
En realidad no declaras cosas, pero así es como creas una matriz en Python:
Esto es divertido, pero no es una buena respuesta para una pregunta etiquetada como "principiante". Solo para dejarlo claro: en Python usualmente usas un tipo de datos llamado a list. Python tiene un tipo de datos de propósito especial llamado an, arrayque se parece más a una matriz C y se usa poco.
steveha
63
No, pero todos los demás ya usaban una lista. Pensé que sería una buena respuesta señalar que también hay matrices.
Lennart Regebro
8
accesorios súper locos por esta respuesta. He estado programando en Python durante años y solo recientemente me di cuenta de que había un objeto de matriz de Python real que es diferente de los objetos de lista. Si bien la estructura de datos es muy similar, las matrices limitan qué tipo de objetos puede contener la matriz. Gran respuesta @LennartRegebro!
Josh Brown el
44
Esta debería ser la lista de respuestas correctas y las matrices son dos cosas diferentes @LennartRegebro gracias
Mina Gabriel
Hay una razón específica por la que puede querer usar matrices en lugar de listas. Específicamente, si tiene una matriz llamada myarray llena de números, puede realizar operaciones matemáticas contra ella, y esas operaciones se aplican a todos los elementos dentro de ella. Entonces, si ejecuta myarray / 3, cada número dentro se divide por 3. Si intenta hacer lo mismo con una lista, obtendrá un error. Por lo tanto, las matrices son más eficientes para grandes conjuntos de datos de números.
Mateo
66
Creo que querías una lista con las primeras 30 celdas ya rellenas. Entonces
f =[]for i in range(30):
f.append(0)
Un ejemplo de dónde podría usarse esto es en la secuencia de Fibonacci. Ver problema 2 en el Proyecto Euler
Dado que esta no es una matriz de python sino una lista de python, ¿no sería menos confuso llamarla "my_list"?
Mattis Asp
44
Eso crea una lista, no una matriz. Son diferentes y tienen diferentes propiedades en python. Específicamente, puede realizar operaciones numéricas en una matriz, pero no en una lista.
import numpy as np
a = np.ones((3,2))# a 2D array with 3 rows, 2 columns, filled with ones
b = np.array([1,2,3])# a 1D array initialised using a list [1,2,3]
c = np.linspace(2,3,100)# an array with 100 points beteen (and including) 2 and 3print(a*1.5)# all elements of a times 1.5print(a.T+b)# b added to the transpose of a
Estas matrices numpy se pueden guardar y cargar desde el disco (incluso comprimido) y los cálculos complejos con grandes cantidades de elementos son rápidos como C.
Muy utilizado en entornos científicos. Mira aquí para más.
de acuerdo. excepto cuidado de llamar incluso a la variable "matriz", u obtener ira purista. a esto también agregaría que de manera similar puede crear "matrices multidimensionales":x=[[0] * 10] * 10
Peter S Magnusson
17
Un par de contribuciones sugirieron que las matrices en Python están representadas por listas. Esto es incorrecto. Python tiene una implementación independiente array()en el módulo de biblioteca estándar array " array.array()" por lo tanto, es incorrecto confundir los dos. Las listas son listas en python, así que tenga cuidado con la nomenclatura utilizada.
Hay una diferencia muy importante entre list y array.array(). Si bien ambos objetos son secuencias ordenadas, array.array () es una secuencia homogénea ordenada, mientras que una lista es una secuencia no homogénea.
Algunas veces debe declarar el tipo de una variable: si no la usa antes, una estructura de control, no existe fuera de la estructura de control y luego construirá una nueva variable. La suposición es que la variable es un int, que choca si la usa como un tipo más complejo.
Más claro
@Clearer sí, el uso de funciones a veces necesita declararlo, y a veces jugar algunos globales cuando se usan funciones y no quiero escribir demasiados argumentos sobre las funciones.
m3nda
No es solo función; Una simple declaración if podría darle el mismo problema.
Más claro
1
La programación se trata de declarar, sin importar qué idioma uses. La declaración de tipos es una historia completamente diferente
Outside_Box
Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia.
Adrian Tompkins
13
Normalmente haría lo a = [1,2,3]que en realidad es, listpero para arraysver esta definición formal
Para agregar a la respuesta de Lennart, se puede crear una matriz como esta:
from array import array
float_array = array("f",values)
donde los valores pueden tomar la forma de una tupla, lista o np.array, pero no una matriz:
values =[1,2,3]
values =(1,2,3)
values = np.array([1,2,3],'f')# 'i' will work here too, but if array is 'i' then values have to be int
wrong_values = array('f',[1,2,3])# TypeError: 'array.array' object is not callable
La mayoría de los métodos para la lista también funcionan con la matriz, los más comunes son pop (), extend () y append ().
A juzgar por las respuestas y comentarios, parece que la estructura de datos de la matriz no es tan popular. Sin embargo, me gusta, de la misma manera que uno preferiría una tupla a una lista.
La estructura de la matriz tiene reglas más estrictas que una lista o np.array, y esto puede reducir los errores y facilitar la depuración, especialmente cuando se trabaja con datos numéricos.
Los intentos de insertar / agregar un flotante a una matriz int arrojarán un TypeError:
Por lo tanto, mantener los valores que están destinados a ser enteros (p. Ej., Lista de índices) en la forma de matriz puede evitar un "TypeError: los índices de lista deben ser enteros, no flotantes", ya que las matrices se pueden repetir, de forma similar a np.array y lists:
int_array = array('i',[1,2,3])
data =[11,22,33,44,55]
sample =[]for i in int_array:
sample.append(data[i])
De manera molesta, agregar un int a una matriz flotante hará que int se convierta en flotante, sin lanzar una excepción.
np.array retiene el mismo tipo de datos para sus entradas también, pero en lugar de dar un error, cambiará su tipo de datos para que se ajusten a las nuevas entradas (generalmente a doble o str):
import numpy as np
numpy_int_array = np.array([1,2,3],'i')for i in numpy_int_array:print(type(i))# <class 'numpy.int32'>
numpy_int_array_2 = np.append(numpy_int_array,int(1))# still <class 'numpy.int32'>
numpy_float_array = np.append(numpy_int_array,float(1))# <class 'numpy.float64'> for all values
numpy_str_array = np.append(numpy_int_array,"1")# <class 'numpy.str_'> for all values
data =[11,22,33,44,55]
sample =[]for i in numpy_int_array_2:
sample.append(data[i])# no problem here, but TypeError for the other two
Esto también es cierto durante la asignación. Si se especifica el tipo de datos, np.array, siempre que sea posible, transformará las entradas a ese tipo de datos:
int_numpy_array = np.array([1,2,float(3)],'i')# 3 becomes an int
int_numpy_array_2 = np.array([1,2,3.9],'i')# 3.9 gets truncated to 3 (same as int(3.9))
invalid_array = np.array([1,2,"string"],'i')# ValueError: invalid literal for int() with base 10: 'string'# Same error as int('string')
str_numpy_array = np.array([1,2,3],'str')print(str_numpy_array)print([type(i)for i in str_numpy_array])# ['1' '2' '3']# <class 'numpy.str_'>
o, en esencia:
data =[1.2,3.4,5.6]
list_1 = np.array(data,'i').tolist()
list_2 =[int(i)for i in data]print(list_1 == list_2)# True
Debido a esto, no es una buena idea usar np.array para comandos específicos de tipo. La estructura de la matriz es útil aquí. La lista conserva el tipo de datos de los valores.
Y para algo que encuentro bastante molesto: el tipo de datos se especifica como el primer argumento en array (), pero (generalmente) el segundo en np.array (). : |
Nota: La naturaleza tipificada y bastante estricta de la matriz se inclina más hacia C en lugar de Python, y por diseño Python no tiene muchas restricciones específicas de tipo en sus funciones. Su impopularidad también crea una retroalimentación positiva en el trabajo colaborativo, y su reemplazo implica principalmente un [int (x) para x en el archivo]. Por lo tanto, es completamente viable y razonable ignorar la existencia de una matriz. No debería obstaculizar a la mayoría de nosotros de ninguna manera. :RE
Estoy aquí porque quería la declaración C: int count[26]={0}; Probablemente haya una mejor manera, pero esta variante de boolsarriba funcionó más count=[0 for ii in range(26)]tarde, luego la cambié a la count=[0]*26que parece preferible.
user1683793
2
Puede crear listas y convertirlas en matrices o puede crear una matriz utilizando el módulo numpy. A continuación hay algunos ejemplos para ilustrar lo mismo. Numpy también facilita el trabajo con matrices multidimensionales.
import numpy as np
a = np.array([1,2,3,4])#For custom inputs
a = np.array([int(x)for x in input().split()])
También puede remodelar esta matriz en una matriz de 2X2 utilizando la función de remodelación que toma la entrada como las dimensiones de la matriz.
__getitem__
no serían O (1).Respuestas:
Ahora se
variable
refiere a una lista vacía * .Por supuesto, esta es una tarea, no una declaración. No hay forma de decir en Python "esta variable nunca debe referirse a otra cosa que no sea una lista", ya que Python se escribe dinámicamente.
* El tipo de Python incorporado predeterminado se llama una lista , no una matriz. Es un contenedor ordenado de longitud arbitraria que puede contener una colección heterogénea de objetos (sus tipos no importan y se pueden mezclar libremente). Esto no debe confundirse con el
array
módulo , que ofrece un tipo más cercano alarray
tipo C ; los contenidos deben ser homogéneos (todos del mismo tipo), pero la longitud sigue siendo dinámica.fuente
variable = ["Hi", "Hello"];
?)my_2x2_list = [[a, b], [c, d]]
. Dependiendo de para qué necesite matrices multidimensionales, también puede considerar usarnumpy
, que define los tipos de matrices para matrices multidimensionales, homogéneas y sin caja que pueden ser mucho más eficientes cuando corresponda, por lo que son preferibles para los cálculos numéricos.Este es un tema sorprendentemente complejo en Python.
Respuesta práctica
Las matrices están representadas por clase
list
(ver referencia y no mezclarlas con generadores ).Vea ejemplos de uso:
Respuesta teórica
Debajo del capó, Python
list
es un contenedor para una matriz real que contiene referencias a elementos. Además, la matriz subyacente se crea con algo de espacio extra.Las consecuencias de esto son:
arr[6653]
es igual aarr[0]
)append
la operación es 'gratis' mientras hay espacio extrainsert
la operación es costosaConsulte esta increíble tabla de complejidad de operaciones .
Además, vea esta imagen, donde he tratado de mostrar las diferencias más importantes entre la matriz, la matriz de referencias y la lista vinculada:
fuente
[1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]
resultado será[2, 3, 4, 5, 6, 7]
a == b[:2]
devuelve True si los primeros 2 elementos de b son iguales a los valores de la matriz aEn realidad no declaras cosas, pero así es como creas una matriz en Python:
Para obtener más información, consulte el módulo de matriz: http://docs.python.org/library/array.html
Ahora es posible que no desee una matriz, sino una lista, pero otros ya han respondido eso. :)
fuente
list
. Python tiene un tipo de datos de propósito especial llamado an,array
que se parece más a una matriz C y se usa poco.Creo que querías una lista con las primeras 30 celdas ya rellenas. Entonces
Un ejemplo de dónde podría usarse esto es en la secuencia de Fibonacci. Ver problema 2 en el Proyecto Euler
fuente
f = [0] * 30
lugar.Así es como:
fuente
Para los cálculos, use matrices numpy como esta:
Estas matrices numpy se pueden guardar y cargar desde el disco (incluso comprimido) y los cálculos complejos con grandes cantidades de elementos son rápidos como C.
Muy utilizado en entornos científicos. Mira aquí para más.
fuente
El comentario de JohnMachin debería ser la verdadera respuesta. ¡Todas las otras respuestas son solo soluciones en mi opinión! Entonces:
fuente
x=[[0] * 10] * 10
Un par de contribuciones sugirieron que las matrices en Python están representadas por listas. Esto es incorrecto. Python tiene una implementación independiente
array()
en el módulo de biblioteca estándararray
"array.array()
" por lo tanto, es incorrecto confundir los dos. Las listas son listas en python, así que tenga cuidado con la nomenclatura utilizada.Hay una diferencia muy importante entre list y
array.array()
. Si bien ambos objetos son secuencias ordenadas, array.array () es una secuencia homogénea ordenada, mientras que una lista es una secuencia no homogénea.fuente
No declaras nada en Python. Solo lo usas. Te recomiendo que comiences con algo como http://diveintopython.net .
fuente
Normalmente haría lo
a = [1,2,3]
que en realidad es,list
pero paraarrays
ver esta definición formalfuente
Para agregar a la respuesta de Lennart, se puede crear una matriz como esta:
donde los valores pueden tomar la forma de una tupla, lista o np.array, pero no una matriz:
y la salida seguirá siendo la misma:
La mayoría de los métodos para la lista también funcionan con la matriz, los más comunes son pop (), extend () y append ().
A juzgar por las respuestas y comentarios, parece que la estructura de datos de la matriz no es tan popular. Sin embargo, me gusta, de la misma manera que uno preferiría una tupla a una lista.
La estructura de la matriz tiene reglas más estrictas que una lista o np.array, y esto puede reducir los errores y facilitar la depuración, especialmente cuando se trabaja con datos numéricos.
Los intentos de insertar / agregar un flotante a una matriz int arrojarán un TypeError:
Por lo tanto, mantener los valores que están destinados a ser enteros (p. Ej., Lista de índices) en la forma de matriz puede evitar un "TypeError: los índices de lista deben ser enteros, no flotantes", ya que las matrices se pueden repetir, de forma similar a np.array y lists:
De manera molesta, agregar un int a una matriz flotante hará que int se convierta en flotante, sin lanzar una excepción.
np.array retiene el mismo tipo de datos para sus entradas también, pero en lugar de dar un error, cambiará su tipo de datos para que se ajusten a las nuevas entradas (generalmente a doble o str):
Esto también es cierto durante la asignación. Si se especifica el tipo de datos, np.array, siempre que sea posible, transformará las entradas a ese tipo de datos:
o, en esencia:
mientras que array simplemente dará:
Debido a esto, no es una buena idea usar np.array para comandos específicos de tipo. La estructura de la matriz es útil aquí. La lista conserva el tipo de datos de los valores.
Y para algo que encuentro bastante molesto: el tipo de datos se especifica como el primer argumento en array (), pero (generalmente) el segundo en np.array (). : |
Aquí se hace referencia a la relación con C: Python List vs. Array: ¿cuándo usarla?
Diviértete explorando!
Nota: La naturaleza tipificada y bastante estricta de la matriz se inclina más hacia C en lugar de Python, y por diseño Python no tiene muchas restricciones específicas de tipo en sus funciones. Su impopularidad también crea una retroalimentación positiva en el trabajo colaborativo, y su reemplazo implica principalmente un [int (x) para x en el archivo]. Por lo tanto, es completamente viable y razonable ignorar la existencia de una matriz. No debería obstaculizar a la mayoría de nosotros de ninguna manera. :RE
fuente
Qué tal esto...
fuente
Python los llama listas . Puede escribir una lista literal con corchetes y comas:
fuente
Siguiendo a Lennart, también hay numpy que implementa matrices multidimensionales homogéneas.
fuente
Tenía una serie de cadenas y necesitaba una matriz de la misma longitud de booleanos iniciados en True. Esto es lo que hice
fuente
int count[26]={0};
Probablemente haya una mejor manera, pero esta variante debools
arriba funcionó máscount=[0 for ii in range(26)]
tarde, luego la cambié a lacount=[0]*26
que parece preferible.Puede crear listas y convertirlas en matrices o puede crear una matriz utilizando el módulo numpy. A continuación hay algunos ejemplos para ilustrar lo mismo. Numpy también facilita el trabajo con matrices multidimensionales.
También puede remodelar esta matriz en una matriz de 2X2 utilizando la función de remodelación que toma la entrada como las dimensiones de la matriz.
fuente