¿Cómo puedo crear un list
que contiene sólo ceros? Quiero ser capaz de crear un ceros list
para cada int
en range(10)
Por ejemplo, si el int
en el rango estaba 4
voy a conseguir:
[0,0,0,0]
y para 7
:
[0,0,0,0,0,0,0]
usuario1040563
¿Cómo puedo crear un list
que contiene sólo ceros? Quiero ser capaz de crear un ceros list
para cada int
en range(10)
Por ejemplo, si el int
en el rango estaba 4
voy a conseguir:
[0,0,0,0]
y para 7
:
[0,0,0,0,0,0,0]
tiffany
#add code here to figure out the number of 0's you need, naming the variable n.
listofzeros = [0] * n
si prefiere ponerlo en la función, simplemente coloque ese código y agregue return listofzeros
Que se vería así:
def zerolistmaker(n):
listofzeros = [0] * n
return listofzeros
salida de muestra:
>>> zerolistmaker(4)
[0, 0, 0, 0]
>>> zerolistmaker(5)
[0, 0, 0, 0, 0]
>>> zerolistmaker(15)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>>
Supongo que esto es una compilación de algunas de las otras cosas, pero lo pone todo junto, y como dice el sitio web, “Estamos aquí para ayudar” (o algo así).
– Tiffany
16 de diciembre de 2011 a las 1:03
solo haz return [0] * n
como listofzeros
es una variable de relleno.
– yurisich
16 de diciembre de 2011 a las 4:20
Hermoso uso de la programación funcional.
– usuario4234032
4 de septiembre de 2017 a las 0:54
Tenga cuidado si hace esto con tipos no primitivos. [{ }] * 5
hará una lista de 5 referencias al mismo diccionario.
– Albert Nemec
2 de septiembre de 2020 a las 23:49
Esta sintaxis es informal y necesita ser actualizada por Python.
– usuario2585501
23 de agosto de 2021 a las 3:12
Seppo Erviälä
$python 2.7.8
from timeit import timeit
import numpy
timeit("list(0 for i in xrange(0, 100000))", number=1000)
> 8.173301935195923
timeit("[0 for i in xrange(0, 100000)]", number=1000)
> 4.881675958633423
timeit("[0] * 100000", number=1000)
> 0.6624710559844971
timeit('list(itertools.repeat(0, 100000))', 'import itertools', number=1000)
> 1.0820629596710205
Deberías usar [0] * n
para generar una lista con n
ceros
Ver por qué [] es más rápido que list()
Sin embargo, hay un problema, ambos itertools.repeat
y [0] * n
creará listas cuyos elementos se refieran a los mismos id
. Esto no es un problema con objetos inmutables como enteros o cadenas, pero si intenta crear una lista de objetos mutables como una lista de listas ([[]] * n
) entonces todos los elementos se referirán al mismo objeto.
a = [[]] * 10
a[0].append(1)
a
> [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
[0] * n
creará la lista inmediatamente mientras repeat
se puede usar para crear la lista de forma perezosa cuando se accede por primera vez.
Si está tratando con una gran cantidad de datos y su problema no necesita una lista de longitud variable o múltiples tipos de datos dentro de la lista, es mejor usar numpy
arreglos
timeit('numpy.zeros(100000, numpy.int)', 'import numpy', number=1000)
> 0.057849884033203125
numpy
las matrices también consumirán menos memoria.
¿Puedes explicar un poco más por qué en casos de objetos mutables esto es un problema? Entonces, en números enteros, aunque son inmutables ya que los elementos se refieren a la misma identificación, ¿no serán todos los elementos del mismo número entero?
– S. Salmán
10 de julio de 2018 a las 17:47
Cuando crea una lista de listas, esperaría que todas las listas sean diferentes entre sí, mientras que en realidad son referencias a la misma lista. Esto no importa con los números enteros ya que no puede cambiar los valores de los números enteros (o cadenas) en Pyhton. Cuando haces operaciones como a = a + 1
obtienes un nuevo id
por a + 1
en lugar de cambiar el valor original en id(a)
.
– Seppo Erviälä
11 de julio de 2018 a las 11:44
El gotcha me atrapó. Para crear una lista de listas de ceros (cuando numpy no es una opción), esto fue lo que se me ocurrió: p_ij = [[0] * k for i in range(k)]
de esa manera no compartiría una identificación y cuando realizó una asignación como p_ij[2][3]
no lo asignaría a TODAS las filas en el tercer elemento.
– Dchaps
3 abr 2021 a las 0:50
Gracias. En python3.9, las brechas de velocidad son las mismas.
– al.zatv
2 feb a las 22:31
La forma más fácil de crear una lista en la que todos los valores sean iguales es multiplicar una lista de un elemento por n
.
>>> [0] * 4
[0, 0, 0, 0]
Así que para tu ciclo:
for i in range(10):
print [0] * i
$ python3
>>> from itertools import repeat
>>> list(repeat(0, 7))
[0, 0, 0, 0, 0, 0, 0]
zeros=[0]*4
puedes reemplazar 4
en el ejemplo anterior con cualquier número que desee.
tipo todo
zlists = [[0] * i for i in range(10)]
zlists[0]
es una lista de 0 ceros, zlists[1]
es una lista de 1 cero, zlists[2]
es una lista de 2 ceros, etc.
Gavin Anderegg
Si desea una función que devuelva un número arbitrario de ceros en una lista, intente esto:
def make_zeros(number):
return [0] * number
list = make_zeros(10)
# list now contains: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Para matrices numéricas grandes, debe usar
numpy
que tiene unzeros
función para hacer esto.– Katriel
16 de diciembre de 2011 a las 0:49
lista de comprensión:
[0 for i in range(7)]
o cualquier número entero que no sea7
.– patrickt
5 oct 2021 a las 11:25