Crear una lista vacía en python con cierto tamaño

Quiero crear una lista vacía (o cualquiera que sea la mejor manera) que puede contener 10 elementos.

Después de eso quiero asignar valores en esa lista, por ejemplo, se supone que esto muestra 0 a 9:

s1 = list(); for i in range(0,9): s1[i] = i print s1 

Pero cuando ejecuto este código, genera un error o, en otro caso, solo muestra [] (vacío).

¿Alguien puede explicar por qué?

No se puede asignar a una lista como lst[i] = something , a menos que la lista ya esté inicializada con al menos i+1 elementos. Debe usar el anexo para agregar elementos al final de la lista. lst.append(something) .

(Podría usar la notación de asignación si estuviera usando un diccionario).

Creando una lista vacía:

 >>> l = [None] * 10 >>> l [None, None, None, None, None, None, None, None, None, None] 

Asignando un valor a un elemento existente de la lista anterior:

 >>> l[1] = 5 >>> l [None, 5, None, None, None, None, None, None, None, None] 

Tenga en cuenta que algo como l[15] = 5 todavía fallaría, ya que nuestra lista tiene solo 10 elementos.

rango (x) crea una lista de [0, 1, 2, … x-1]

 # 2.X only. Use list(range(10)) in 3.X. >>> l = range(10) >>> l [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

Usando una función para crear una lista:

 >>> def display(): ... s1 = [] ... for i in range(9): # This is just to tell you how to create a list. ... s1.append(i) ... return s1 ... >>> print display() [0, 1, 2, 3, 4, 5, 6, 7, 8] 

Listar comprensión (usando los cuadrados porque para el rango no necesita hacer todo esto, solo puede devolver el range(0,9) ):

 >>> def display(): ... return [x**2 for x in range(9)] ... >>> print display() [0, 1, 4, 9, 16, 25, 36, 49, 64] 

Intenta esto en su lugar:

 lst = [None] * 10 

Lo anterior creará una lista de tamaño 10, donde cada posición se inicializa a None . Después de eso, puedes agregarle elementos:

 lst = [None] * 10 for i in range(10): lst[i] = i 

Es cierto que esa no es la forma pythonica de hacer las cosas. Mejor haz esto:

 lst = [] for i in range(10): lst.append(i) 

O incluso mejor , use listas de comprensión como esta:

 [i for i in range(10)] 

la respuesta actualmente aceptada de varunl

  >>> l = [None] * 10 >>> l [None, None, None, None, None, None, None, None, None, None] 

Funciona bien para tipos que no son de referencia, como los números. Desafortunadamente, si desea crear una lista de listas, se encontrará con errores de referencia. Ejemplo en Python 2.7.6:

 >>> a = [[]]*10 >>> a [[], [], [], [], [], [], [], [], [], []] >>> a[0].append(0) >>> a [[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]] >>> 

Como puede ver, cada elemento apunta al mismo objeto de lista. Para solucionar esto, puede crear un método que inicialice cada posición a una referencia de objeto diferente.

 def init_list_of_objects(size): list_of_objects = list() for i in range(0,size): list_of_objects.append( list() ) #different object reference each time return list_of_objects >>> a = init_list_of_objects(10) >>> a [[], [], [], [], [], [], [], [], [], []] >>> a[0].append(0) >>> a [[0], [], [], [], [], [], [], [], [], []] >>> 

Es probable que haya una forma predeterminada de Python integrada para hacer esto (en lugar de escribir una función), pero no estoy seguro de qué es. Estaría feliz de ser corregido!

Edición: Es [ [] for _ in range(10)]

Ejemplo:

 >>> [ [random.random() for _ in range(2) ] for _ in range(5)] >>> [[0.7528051908943816, 0.4325669600055032], [0.510983236521753, 0.7789949902294716], [0.09475179523690558, 0.30216475640534635], [0.3996890132468158, 0.6374322093017013], [0.3374204010027543, 0.4514925173253973]] 

Puede .append(element) a la lista, por ejemplo: s1.append(i) . Lo que está intentando hacer actualmente es acceder a un elemento ( s1[i] ) que no existe.

Hay dos métodos “rápidos”:

 x = length_of_your_list a = [None]*x # or a = [None for _ in xrange(x)] 

Parece que [None]*x es más rápido:

 >>> from timeit import timeit >>> timeit("[None]*100",number=10000) 0.023542165756225586 >>> timeit("[None for _ in xrange(100)]",number=10000) 0.07616496086120605 

Pero si está de acuerdo con un rango (por ejemplo, [0,1,2,3,...,x-1] ), entonces el range(x) podría ser el más rápido:

 >>> timeit("range(100)",number=10000) 0.012513160705566406 

(Esto fue escrito basándose en la versión original de la pregunta).

Quiero crear una lista vacía (o lo que sea la mejor manera) puede contener 10 elementos.

Todas las listas pueden contener tantos elementos como desee, sujetos solo al límite de memoria disponible. El único “tamaño” de una lista que importa es el número de elementos que contiene actualmente .

pero cuando lo ejecuto, el resultado es []

print display s1 no es una syntax válida; basado en su descripción de lo que está viendo, asumo que quiso decir display(s1) y luego print s1 . Para que se ejecute, debe haber definido previamente un s1 global para pasar a la función.

La display llamada no modifica la lista que se pasa, como está escrito. Su código dice que ” s1 es un nombre para cualquier cosa que se haya pasado a la función; está bien, ahora lo primero que haremos es olvidarlo por completo, y dejar que s1 comience a referirse a una list recién creada. Ahora ‘ Modificaré esa list “. Esto no tiene ningún efecto sobre el valor que ha pasado.

No hay razón para pasar un valor aquí. (Tampoco hay una razón real para crear una función, pero eso no viene al caso.) Desea “crear” algo, de modo que esa es la salida de su función. No se requiere información para crear lo que describe, así que no pase información. Para obtener información, return .

Eso te daría algo como:

 def display(): s1 = list(); for i in range(0, 9): s1[i] = i return s1 

El siguiente problema que observará es que su lista solo tendrá 9 elementos, ya que la función de range omite el punto final. (Como notas laterales, [] funciona igual de bien que list() , el punto y coma no es necesario, s1 es un mal nombre para la variable y solo se necesita un parámetro para el range si está empezando desde 0 ). terminar con

 def create_list(): result = list() for i in range(10): result[i] = i return result 

Sin embargo, todavía falta la marca; range no es una palabra clave mágica que forma parte del lenguaje de la forma y la def , pero es una función. ¿Y adivina qué función devuelve? Así es, una lista de esos enteros. Así que toda la función colapsa para

 def create_list(): return range(10) 

y ahora ves por qué no necesitamos escribir una función en absoluto; range ya es la función que estamos buscando. Aunque, nuevamente, no hay necesidad ni razón para “pre-dimensionar” la lista.

Me sorprende que nadie sugiera este enfoque simple para crear una lista de listas vacías. Este es un hilo viejo, pero solo añadiendo esto para completar. Esto creará una lista de 10 listas vacías.

 x = [[] for i in range(10)] 

Me sorprende un poco que la forma más fácil de crear una lista inicializada no esté en ninguna de estas respuestas. Solo usa un generador en la función de list :

 list(range(9)) 

Aquí está mi código para la lista 2D en python que leería no. de filas desde la entrada:

 empty = [] row = int(input()) for i in range(row): temp = list(map(int, input().split())) empty.append(temp) for i in empty: for j in i: print(j, end=' ') print('') 

Una forma sencilla de crear una matriz 2D de tamaño n utilizando las comprensiones de listas anidadas:

 m = [[None for _ in range(n)] for _ in range(n)] 

Encontré esta pregunta de SO mientras buscaba un problema similar. Tuve que construir una matriz 2D y luego reemplazar algunos elementos de cada lista (en matriz 2D) con elementos de un dict. Luego encontré esta pregunta de SO que me ayudó, tal vez esto ayude a otros principiantes a moverse. El truco clave fue inicializar la matriz 2D como una matriz numpy y luego usar la array[i,j] lugar de la array[i][j] .

Como referencia, este es el código donde tuve que usar esto:

 nd_array = [] for i in range(30): nd_array.append(np.zeros(shape = (32,1))) new_array = [] for i in range(len(lines)): new_array.append(nd_array) new_array = np.asarray(new_array) for i in range(len(lines)): splits = lines[i].split(' ') for j in range(len(splits)): #print(new_array[i][j]) new_array[i,j] = final_embeddings[dictionary[str(splits[j])]-1].reshape(32,1) 

Ahora sé que podemos usar la comprensión de listas, pero por simplicidad estoy usando un bucle nested para. Espero que esto ayude a otros que vienen a través de este post.

Este código genera una matriz que contiene 10 números aleatorios.

 import random numrand=[] for i in range(0,10): a = random.randint(1,50) numrand.append(a) print(a,i) print(numrand) 

Hazlo más reutilizable como función.

 def createEmptyList(length,fill=None): ''' return a (empty) list of a given length Example: print createEmptyList(3,-1) >> [-1, -1, -1] print createEmptyList(4) >> [None, None, None, None] ''' return [fill] * length 
 s1 = [] for i in range(11): s1.append(i) print s1 

Para crear una lista, solo use estos corchetes: “[]”

Para agregar algo a una lista, use list.append ()