Python中的零列表
我如何创build一个只包含零的list
? 我希望能够为range(10)
每个int
创build一个零list
range(10)
例如,如果范围内的int
是4
我会得到:
[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))