python中的零列表

List of zeros in python

本问题已经有最佳答案,请猛点这里访问。

如何创建一个只包含零的list?我想能够为range(10)中的每个int创建一个零list

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

1
[0,0,0,0]

对于7

1
[0,0,0,0,0,0,0]


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

如果您愿意将它放入函数中,只需放入该代码并添加return listofzeros

看起来像这样:

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

样品输出:

1
2
3
4
5
6
7
>>> 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]
>>>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$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()快

不过,有一个gotcha,itertools.repeat[0] * n都将创建元素引用相同id的列表。这不是整数或字符串等不可变对象的问题,但如果您尝试创建可变对象列表,例如列表列表([[]] * n),则所有元素都将引用同一对象。

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

[0] * n将立即创建列表,而repeat可用于在首次访问时延迟创建列表。

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

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

numpy阵列也将消耗更少的内存。


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

1
2
>>> [0] * 4
[0, 0, 0, 0]

所以对于你的循环:

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

1
2
3
4
$ python3
>>> from itertools import repeat
>>> list(repeat(0, 7))
[0, 0, 0, 0, 0, 0, 0]

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

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


zeros=[0]*4

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


如果希望函数在列表中返回任意数量的零,请尝试以下操作:

1
2
3
4
5
6
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方法:

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