¿Hay alguna manera en Python de inicializar una matriz/lista multidimensional sin utilizar un bucle?Inicialización de matriz multidimensional de Python sin un bucle
Respuesta
Claro hay es una forma
arr = eval(`[[0]*5]*10`)
o
arr = eval(("[[0]*5]+"*10)[:-1])
pero es horrible y derrochador, por lo que todo el mundo utiliza bucles (por lo general las listas por comprensión) o numpy
Marcar como aceptado como mejor refleja la pregunta. Numpy no es parte de la instalación estándar de Python. – Leonid
Esto tiene el inconveniente de crear referencias a los mismos objetos, ver [esta respuesta] (http://stackoverflow.com/a/3662548/393885) –
@black_puppydog, no, no es así. Es por eso que 'eval' se usa aquí –
Depende de a qué va a inicializar la matriz, pero seguro. Se puede utilizar una lista por comprensión para crear una matriz 5 × 3, por ejemplo:
>>> [[0 for x in range(3)] for y in range(5)]
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> [[3*y+x for x in range(3)] for y in range(5)]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14]]
Sí, supongo que esto todavía tiene bucles — pero se hace todo en una sola línea, que supongo que es el significado pretendido de su ¿pregunta?
¿Eso no cuenta como usar un bucle? –
Los documentos lo especifican como una forma de inicializar la lista multidimensional. Para una lista unidimensional, la siguiente inicialización es posible 'list = [5] * 10', pero no puede hacer que funcione con más dimensiones. Parece que cuando haces 'list = [[5] * 5] * 5', entonces cada subdivisión apuntará a la misma memoria, que no es lo que quiero. – Leonid
Claro, usted puede simplemente hacer
mylist = [
[1,2,3],
[4,5,6],
[7,8,9]
]
Tiene toda la razón, y no estoy preguntando cómo se verá una matriz 1000 X 1000 ... – Leonid
En función de sus necesidades reales, de facto "estándar" paquete Numpy podría ofrecerle exactamente lo que necesita.
Por ejemplo, puede crear una matriz multi-dimensional con
numpy.empty((10, 4, 100)) # 3D array
(inicializado con valores arbitrarios) o crear las mismas matrices con ceros todas partes con
numpy.zeros((10, 4, 100))
Numpy es muy rápido, para operaciones de matriz.
Hm ... ¿ambos ejemplos crearían una matriz de 10 x 4 x 100? –
Definitivamente lo hacen. Puede verificar esto haciendo 'a = numpy.empty ((10, 4, 100)); imprimir a.shape'. – EOL
No creo que sea posible.
se puede hacer algo como esto:
>>> a = [[0] * 5] * 5
para crear una matriz de 5x5, pero se repite objetos (que no desea). Por ejemplo:
>>> a[1][2] = 1
[[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]]
Es casi seguro que es necesario utilizar algún tipo de bucle como en:
[[0 for y in range(5)] for x in range(5)]
>>> a = [[0] * 5] * 5 Es un poco peligroso ... quizás sea bueno si usa cero. Pero si intentas poner allí tu variable. Obtiene una lista de listas que hacen referencia al mismo valor. por ejemplo, cuando establece un [1] [1] = 5 - ¡toda la lista tendrá el elemento en 1 posición como 5! – RredCat
Si estás haciendo un trabajo numérico usando Numpy, algo así como
x = numpy.zeros ((m,n))
x = numpy.ones ((m,n))
La recursividad es su amigo: D
Es una aplicación bastante ingenua pero funciona !
dim = [2, 2, 2]
def get_array(level, dimension):
if(level != len(dimension)):
return [get_array(level+1, dimension) for i in range(dimension[level])]
else:
return 0
print get_array(0, dim)
¡Esto es justo lo que buscaba, gracias!Mi única advertencia es que prefiero enviar por una matriz dimensión más corta, en lugar de dos parámetros, como en: [get_array (dimensión [1:]) para j en xrange (dimensión [0])] – Jaime
Python no tiene matrices. Tiene otros tipos de secuencias que van desde listas hasta diccionarios sin olvidar conjuntos; el correcto depende de sus necesidades específicas.
Asumiendo que su "matriz" es en realidad una lista, y "inicializar" medios asignan una lista de listas de NxM elementos, puede (pseudocódigo):
- N veces: M veces: añadir un elemento
- N veces: añadir una fila de M elementos
- escribir todo el asunto
usted dice que no quiere bucle y eso descarta el abeto dos puntos, pero ¿por qué? También dices que no quieres escribir la cosa (en respuesta a JacobM), entonces, ¿cómo harías exactamente eso? No conozco otra forma de obtener una estructura de datos sin generarla en pedazos más pequeños (bucle) o escribirla explícitamente, en cualquier lenguaje de programación.
También tenga en cuenta que una lista inicializada pero vacía no es mejor que ninguna lista, a menos que ingrese datos en ella. Y no necesita inicializarlo antes de poner datos ...
Si esto no es un ejercicio teórico, probablemente esté haciendo una pregunta incorrecta. Te sugiero que expliques qué necesitas hacer con esa matriz.
vas a profundizar en algunos de los puntos :)) El punto de la pregunta es muy simple y pregunta qué es lo que pide. Me preguntaba acerca de las diferentes técnicas que usan las personas para la inicialización de ** listas ** multidimensionales, y las respuestas a la pregunta reflejan perfectamente lo que quería saber. Algunas personas usan la biblioteca Numpy estándar de * facto *. Algunas personas inicializan listas usando 'for' loops obviamente. Como * JacobM * sugiere que puede inicializar estadísticamente las listas, pero le señalo que no es aplicable para listas grandes. * gnibbler * sugiere una forma muy interesante pero funky y no eficiente. – Leonid
Me preguntaba en particular sobre la inicialización sin 'for' loops, ya que era obvio de los documentos cómo lo haría. – Leonid
a = [[]]
a.append([1,2])
a.append([2,3])
Entonces
>>> a
[[1, 2], [2, 3]]
Lo siguiente no utilizar cualquier biblioteca especial, ni eval:
arr = [[0]*5 for x in range(6)]
y no crea referencias duplicadas:
>>> arr[1][1] = 2
>>> arr
[[0, 0, 0, 0, 0],
[0, 2, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]
Puede usar matriz N-dimensional (ndarray). Aquí está el enlace a la documentación. http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html
- 1. crear una matriz multidimensional en un bucle
- 2. PHP bucle foreach través matriz multidimensional
- 3. Lenguaje D: ¿inicialización de mejores prácticas dinámicas de matriz multidimensional?
- 4. Inicialización de la matriz en Python
- 5. bucle OpenMP anidado multidimensional
- 6. PHP - Crear una matriz multidimensional a través de un bucle basado en un recuento
- 7. Numpy: ordenar una matriz multidimensional por una matriz multidimensional
- 8. Leer lista plana en matriz/matriz multidimensional en python
- 9. Conjunto multidimensional en Python
- 10. Tabla de datos a matriz multidimensional
- 11. typedef de una matriz multidimensional?
- 12. simulación lineal de matriz multidimensional
- 13. PHP - Ordenar matriz multidimensional por otra matriz
- 14. ordenación de matriz multidimensional en AS3
- 15. iteración a través de una matriz multidimensional en Python
- 16. usando array_search de matriz multidimensional
- 17. F # Tipos de matriz multidimensional
- 18. ¿Cómo escribir una matriz multidimensional en un archivo de texto?
- 19. Arrays.fill con matriz multidimensional en Java
- 20. Buscar matriz multidimensional JavaScript
- 21. array_filter y matriz multidimensional
- 22. Inicialización matriz de tamaño variable en Java
- 23. PHP manipular matriz multidimensional valores
- 24. SetLength en matriz multidimensional
- 25. Numpy matriz multidimensional rebanar
- 26. Javascript: ordena matriz multidimensional
- 27. Jinja2: ¿Cómo crear una matriz javascript multidimensional?
- 28. matriz multidimensional jquery.each
- 29. ¿Puedo limpiar una matriz numpy sin un bucle?
- 30. para el bucle de inicialización falta
Esta pregunta es ligeramente vaga: ¿desea inicializar una matriz multidimensional vacía, o desea inicializar la matriz multidimensional a un conjunto específico de valores? –