Quiero crear una lista vacía (o lo 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 de 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 se muestra []
(vacío).
¿Alguien puede explicar por qué?
[]
) por definición tiene cero elementos. Lo que aparentemente quiere es una lista de valores Falsy comoNone
,0
, o''
.0
a9
debería usarfor i in range(0, 10)
, lo que significafor (int i = 0, i < 10, i++)
.Respuestas:
No puede asignar a una lista como
lst[i] = something
, a menos que la lista ya esté inicializada con al menosi+1
elementos. Debe usar append 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).
Crear una lista vacía:
Asignación de un valor a un elemento existente de la lista anterior:
Tenga en cuenta que algo así
l[15] = 5
todavía fallaría, ya que nuestra lista tiene solo 10 elementos.range (x) crea una lista de [0, 1, 2, ... x-1]
Usando una función para crear una lista:
Comprensión de la lista (Usando los cuadrados porque para el rango no necesita hacer todo esto, puede regresar
range(0,9)
):fuente
a = [0 for _ in range(10)]
Intenta esto en su lugar:
Lo anterior creará una lista de tamaño 10, donde se inicializa cada posición
None
. Después de eso, puede agregarle elementos:Es cierto que esa no es la forma pitónica de hacer las cosas. Mejor haz esto:
O incluso más simple , en Python 2.x puede hacer esto para inicializar una lista con valores de 0 a 9:
Y en Python 3.x:
fuente
lst = [''] * 10
olst = [0] * 10
arr = [None for _ in range(10)]
.respuesta aceptada actualmente de varunl
Funciona bien para tipos sin referencia como los números. Lamentablemente, si desea crear una lista de listas, se encontrará con errores de referencia. Ejemplo en Python 2.7.6:
Como puede ver, cada elemento apunta al mismo objeto de lista. Para evitar esto, puede crear un método que inicializará cada posición a una referencia de objeto diferente.
Es probable que haya una forma predeterminada de hacerlo en Python (en lugar de escribir una función), pero no estoy seguro de qué es. Estaría feliz de ser corregido!
Editar: es
[ [] for _ in range(10)]
Ejemplo:
fuente
append
muy a menudo es inferior a la lista de comprensiones. Puede crear su lista de listas a través de[ [] for _ in range(10)]
.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.fuente
Hay dos métodos "rápidos":
Parece que
[None]*x
es más rápido:Pero si está de acuerdo con un rango (por ejemplo
[0,1,2,3,...,x-1]
), entoncesrange(x)
podría ser más rápido:fuente
list(range(n))
, yarange()
que no devuelve una lista pero es un iterador, y eso no es más rápido que[None] * n
.Me sorprende que nadie sugiera este enfoque simple para crear una lista de listas vacías. Este es un hilo viejo, pero solo agrega esto para completarlo. Esto creará una lista de 10 listas vacías.
fuente
x = [[]] * 10
es que en este último, cada elemento de la lista apunta al MISMO objeto de la lista . Entonces, a menos que simplemente desee 10 copias del mismo objeto, use larange
variante basada ya que crea 10 objetos nuevos . Encontré esta distinción muy importante.(Esto fue escrito en base a la versión original de la pregunta).
Todas las listas pueden contener tantos elementos como desee, sujeto solo al límite de memoria disponible. El único "tamaño" de una lista que importa es la cantidad de elementos que hay actualmente en ella.
print display s1
no es una sintaxis válida; según su descripción de lo que está viendo, supongo que quiso decirdisplay(s1)
y luegoprint s1
. Para que eso se ejecute, debe haber definido previamente un globals1
para pasar a la función.Llamar
display
no modifica la lista que pasa, tal como está escrita. Su código dice "s1
es un nombre para cualquier cosa que se haya pasado a la función; bueno, ahora lo primero que haremos será olvidarnos de esa cosa por completo y dejar ques1
comience a referirse a una nueva creaciónlist
. Ahora modificaremos esolist
". Esto no tiene ningún efecto sobre el valor que pasó.No hay ninguna 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, por lo que ese es el resultado de su función. No se requiere información para crear lo que describe, así que no pase ninguna información. Para obtener información, hágalo
return
.Eso te daría algo como:
El siguiente problema que notará es que su lista solo tendrá 9 elementos, porque la
range
función omite el punto final . (Como notas al margen,[]
funciona igual de bienlist()
, el punto y coma es innecesario,s1
es un nombre pobre para la variable, y solo se necesita un parámetrorange
si está comenzando desde0
). Entonces termina conSin embargo, esto todavía falta la marca;
range
no es una palabra clave mágica que forma parte del lenguajefor
ydef
es, sino que es una función. ¿Y adivina qué devuelve esa función? Así es, una lista de esos enteros. Entonces toda la función colapsa ay ahora ves por qué no necesitamos escribir una función nosotros mismos en absoluto;
range
ya es la función que estamos buscando. Aunque, de nuevo, no hay necesidad o razón para "pre-dimensionar" la lista.fuente
Una forma sencilla de crear una matriz de tamaño en 2D
n
utilizando comprensiones de listas anidadas:fuente
Estoy un poco sorprendido de que la forma más fácil de crear una lista inicializada no esté en ninguna de estas respuestas. Simplemente use un generador en la
list
función:fuente
range(9)
delist()
? ¿range(9)
Ya no devuelve una lista?range
no es una lista, ni un generador. Es una subclase inmutable incorporada deSequence
.Aquí está mi código para la lista 2D en python que leería no. de filas de la entrada:
fuente
La respuesta aceptada tiene algunas trampas. Por ejemplo:
Entonces cada diccionario se refiere al mismo objeto. Lo mismo es cierto si inicializa con matrices u objetos.
Podrías hacer esto en su lugar:
fuente
Encontré esta pregunta SO mientras buscaba un problema similar. Tuve que construir una matriz 2D y luego reemplazar algunos elementos de cada lista (en una matriz 2D) con elementos de un dict. Luego me encontré con esta pregunta 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 usarla en
array[i,j]
lugar dearray[i][j]
.Como referencia, este es el fragmento de código donde tuve que usar esto:
Ahora sé que podemos usar la comprensión de la lista, pero por simplicidad estoy usando un bucle for anidado. Espero que esto ayude a otros que se encuentran con esta publicación.
fuente
Hazlo más reutilizable como una función.
fuente
Para crear una lista, solo use estos corchetes: "[]"
Para agregar algo a una lista, use list.append ()
fuente
Este código genera una matriz que contiene 10 números aleatorios.
fuente