如何创建一个只包含0的list ?我希望能够为range(10)中的每个int创建一个0 list
list
range(10)
int
例如,如果范围内的int是4,我将得到:
4
[0,0,0,0]
和7:
7
[0,0,0,0,0,0,0]
创建所有值都相同的列表最简单的方法是将一个单元素列表乘以n。
n
>>> [0] * 4 [0, 0, 0, 0]
对于你的循环:
for i in range(10): print [0] * i
zeros=[0]*4
你可以用任何你想要的数字替换上面例子中的4。
zlists = [[0] * i for i in range(10)]
zlists[0]是0个0的列表,zlists[1]是1个0的列表,zlists[2]是2个0的列表,等等。
zlists[0]
zlists[1]
zlists[2]
如果你想要一个函数在列表中返回任意数量的0,试试这个:
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))
$ python3 >>> from itertools import repeat >>> list(repeat(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
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零的列表。
[0] * n
看看为什么[]比list()快
但这里有一个问题,itertools.repeat和[0] * n都会创建元素指向相同id的列表。对于整数或字符串等不可变对象,这不是问题,但如果你试图创建列表的列表([[]] * n)这样的可变对象列表,那么所有元素将引用同一个对象。
itertools.repeat
id
[[]] * n
a = [[]] * 10 a[0].append(1) a > [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
[0] * n将立即创建列表,而repeat可用于在第一次访问时惰性地创建列表。
repeat
如果你处理的是非常大量的数据,而且你的问题不需要可变长度的列表或列表中的多个数据类型,最好使用numpy数组。
numpy
timeit('numpy.zeros(100000, numpy.int)', 'import numpy', number=1000) > 0.057849884033203125
numpy数组也将消耗更少的内存。