2011-12-15 34 views
140

¿Cómo puedo crear un list que contiene solo ceros? Quiero ser capaz de crear una ceros list para cada int en range(10)Lista de ceros en python

Por ejemplo, si el int en el rango fue 4 que obtendrá:

[0,0,0,0] 

y para 7:

[0,0,0,0,0,0,0] 
+2

Para matrices numéricas grandes, debe usar 'numpy', que tiene una función' ceros' para hacer esto. – katrielalex

Respuesta

248
#add code here to figure out the number of 0's you need, naming the variable n. 
listofzeros = [0] * n 

si lo prefiere para ponerlo en la función, simplemente dejar en ese código y añadir return listofzeros

Cuál sería el siguiente:

def zerolistmaker(n): 
    listofzeros = [0] * n 
    return listofzeros 

resultado de ejemplo:

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

Supongo que esta 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

+15

simplemente haz 'return [0] * n', ya que' listofzeros' es una variable de relleno. – Droogans

+0

Hermoso uso de la programación funcional – Typhon

23

La forma más fácil de crear una lista donde todos los valores son iguales es multiplicar una lista de elementos por n.

>>> [0] * 4 
[0, 0, 0, 0] 

Así que para su bucle:

for i in range(10): 
    print [0] * i 
3

zeros=[0]*4

puede reemplazar 4 en el ejemplo anterior con cualquier número que desee.

5
zlists = [[0] * i for i in range(10)] 

zlists[0] es una lista de ceros 0, zlists[1] es una lista de 1 a cero, zlists[2] es una lista de 2 ceros, etc.

+0

Esta es una buena idea, pero no funciona para listas de más de 9 ceros. Se remedia fácilmente (aunque nunca funcionará para listas arbitrarias), pero luego se encuentra con un problema mayor, que es que almacena [T_N] (http://en.wikipedia.org/wiki/Triangular_number) ceros en la memoria. Es mejor usar una función de fábrica, como lo ha hecho Ben en su respuesta aceptada. –

+0

Hay otro problema con esto, que es una ligera sutileza debido a la forma en que funcionan las referencias: 'a = zlists [3]; a.append [5]; b = zlists [3]; imprime b' salidas '[0, 0, 0, 5]'. 'b' no es una lista de ceros, ¡como uno podría esperar ingenuamente! –

+0

La pregunta era hacer una lista de listas de ceros. Mi respuesta hace eso. En cuanto a su segundo "problema", tendría el mismo problema sin importar cómo haya hecho la lista. – kindall

2

Si desea una función que devuelve 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] 
1

Aquí es el xrange manera:

list(0 for i in xrange(0,5)) 
7
$ python3 
>>> from itertools import repeat 
>>> list(repeat(0, 7)) 
[0, 0, 0, 0, 0, 0, 0] 
36
$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 

Debe usar [0] * n para generar una lista con n ceros.

See why [] is faster than list()

Hay una Gotcha embargo, tanto itertools.repeat y [0] * n creará listas cuyos elementos se refieren a id misma. 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 va a crear la lista de inmediato, mientras repeat se puede utilizar para crear la lista perezosamente cuando se accede a ella por primera vez.

Si se trata de una gran cantidad de datos y su problema no necesita una longitud variable de la lista o múltiples tipos de datos dentro de la lista, es mejor utilizar las matrices numpy.

timeit('numpy.zeros(100000, numpy.int)', 'import numpy', number=1000) 
> 0.057849884033203125 

numpy matrices también consumirán menos memoria.