2010-09-07 12 views

Respuesta

12

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

+0

Marcar como aceptado como mejor refleja la pregunta. Numpy no es parte de la instalación estándar de Python. – Leonid

+1

Esto tiene el inconveniente de crear referencias a los mismos objetos, ver [esta respuesta] (http://stackoverflow.com/a/3662548/393885) –

+1

@black_puppydog, no, no es así. Es por eso que 'eval' se usa aquí –

2

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?

+3

¿Eso no cuenta como usar un bucle? –

+0

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

5

Claro, usted puede simplemente hacer

mylist = [ 
      [1,2,3], 
      [4,5,6], 
      [7,8,9] 
     ] 
+3

Tiene toda la razón, y no estoy preguntando cómo se verá una matriz 1000 X 1000 ... – Leonid

9

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.

+0

Hm ... ¿ambos ejemplos crearían una matriz de 10 x 4 x 100? –

+1

Definitivamente lo hacen. Puede verificar esto haciendo 'a = numpy.empty ((10, 4, 100)); imprimir a.shape'. – EOL

3

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)] 
+1

>>> 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

1

Si estás haciendo un trabajo numérico usando Numpy, algo así como

x = numpy.zeros ((m,n)) 
x = numpy.ones ((m,n)) 
3

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) 
+0

¡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

1

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.

+0

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

+0

Me preguntaba en particular sobre la inicialización sin 'for' loops, ya que era obvio de los documentos cómo lo haría. – Leonid

1
a = [[]] 
a.append([1,2]) 
a.append([2,3]) 

Entonces

>>> a 
[[1, 2], [2, 3]] 
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]] 
Cuestiones relacionadas