Python中的零列表

我如何创build一个只包含零的list ? 我希望能够为range(10)每个int创build一个零list range(10)

例如,如果范围内的int4我会得到:

 [0,0,0,0] 

7

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

如果你喜欢把它放在函数中,只需在代码中添加return listofzeros

这看起来像这样:

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

样本输出:

 >>> 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] >>> 
 $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 

您应该使用[0] * n来生成一个有n零的列表。

看看为什么[]比list()更快

虽然有一个问题, itertools.repeat[0] * n将创build其元素引用相同的id列表。 这对像整数或string这样的不可变对象来说不是问题,但是如果你尝试创build像列表列表( [[]] * n )那样的可变对象列表,那么所有的元素都会引用同一个对象。

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

[0] * n将立即创build列表,而repeat可以用于第一次访问时懒惰地创build列表。

如果您处理的数据量非常大,而且您的问题不需要列表中可变长度的列表或多个数据types,则最好使用numpy数组。

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

numpy数组也将消耗更less的内存。

创build所有值相同的列表的最简单方法是将单元素列表乘以n

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

所以对于你的循环:

 for i in range(10): print [0] * i 
 $ python3 >>> from itertools import repeat >>> list(repeat(0, 7)) [0, 0, 0, 0, 0, 0, 0] 
 zlists = [[0] * i for i in range(10)] 

zlists[0]是0个零的列表, zlists[1]是1个零的列表, zlists[2]是2个零的列表等等。

zeros=[0]*4

在上面的例子中,你可以用你想要的任何数字代替4

如果你想要一个将返回任意数量的零的函数,试试这个:

 def make_zeros(number): return [0] * number list = make_zeros(10) # list now contains: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

这是xrange的方法:

 list(0 for i in xrange(0,5))