lists - python empty list
Crear una lista vacía en python con cierto tamaño (14)
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, esto se supone que 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é?
Agregando a las sorprendentes respuestas escritas arriba,
Para crear simplemente una lista vacía, supuestamente con el uso de "ceros",
lst=[0]*size
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('''')
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 me encontré con this pregunta 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]
.
Para 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 anidado 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)
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 más rápido:
>>> timeit("range(100)",number=10000)
0.012513160705566406
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
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 pitónica 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 sin referencia como 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]]
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))
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 la 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]
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.
(Esto fue escrito basado 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 sintaxis 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 " 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 efecto en 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
, sino que es una función. ¿Y adivina qué función devuelve? Eso es correcto - una lista de esos enteros. Así que toda la función se 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.
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 ()