python中的零列表

use*_*563 235 python

如何创建list仅包含零的零件?我希望能够创造一个零list为每个intrange(10)

例如,如果int在范围内4我会得到:

[0,0,0,0]
Run Code Online (Sandbox Code Playgroud)

并为7:

[0,0,0,0,0,0,0]
Run Code Online (Sandbox Code Playgroud)

Tif*_*any 404

#add code here to figure out the number of 0's you need, naming the variable n.
listofzeros = [0] * n
Run Code Online (Sandbox Code Playgroud)

如果你想把它放在函数中,只需输入该代码并添加即可 return listofzeros

看起来像这样:

def zerolistmaker(n):
    listofzeros = [0] * n
    return listofzeros
Run Code Online (Sandbox Code Playgroud)

样本输出:

>>> 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]
>>> 
Run Code Online (Sandbox Code Playgroud)

  • 只需要`return [0]*n`,因为`listofzeros`是填充变量. (19认同)
  • 如果您对非原始类型执行此操作,请注意。`[{ }] * 5` 将列出对同一字典的 5 个引用。 (2认同)
  • @AlbertNemec这是一个重要的警告。我们很容易认为“[{}] * 5”与列表理解“[{} for i in range(5)]”相同,但事实并非如此。对于初学者(以及有经验的用户)来说是一个陷阱。 (2认同)

Sep*_*älä 50

$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
Run Code Online (Sandbox Code Playgroud)

您应该使用[0] * n生成带n零的列表.

看看为什么[]比列表更快()

有一个疑难杂症虽然两者itertools.repeat[0] * n会创建列表,其元素是指相同的id.这对于整数或字符串等不可变对象来说不是问题,但如果您尝试创建可变对象列表(如列表列表([[]] * n)),则所有元素都将引用同一对象.

a = [[]] * 10
a[0].append(1)
a
> [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
Run Code Online (Sandbox Code Playgroud)

[0] * n将立即创建列表,同时repeat可用于在首次访问时懒惰地创建列表.

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

timeit('numpy.zeros(100000, numpy.int)', 'import numpy', number=1000)
> 0.057849884033203125
Run Code Online (Sandbox Code Playgroud)

numpy 数组也会消耗更少的内存.

  • 您会期望当您创建一个列表列表时,所有列表都彼此不同,而它们实际上是对同一个列表的引用。这与整数无关,因为您不能在 Pyhton 中更改整数(或字符串)的值。当您执行类似 `a = a + 1` 的操作时,您会为 `a + 1` 获得一个新的 `id`,而不是更改 `id(a)` 的原始值。 (2认同)
  • 问题抓住了我。为了创建一个零列表列表(当 numpy 不是一个选项时),这就是我想出的: `p_ij = [[0] * k for i in range(k)]` 这样它就不会共享一个 ID,当您进行诸如“p_ij[2][3]”之类的分配时,它不会将其分配给第三个元素处的所有行。 (2认同)

And*_*ark 27

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

>>> [0] * 4
[0, 0, 0, 0]
Run Code Online (Sandbox Code Playgroud)

所以你的循环:

for i in range(10):
    print [0] * i
Run Code Online (Sandbox Code Playgroud)


kev*_*kev 11

$ python3
>>> from itertools import repeat
>>> list(repeat(0, 7))
[0, 0, 0, 0, 0, 0, 0]
Run Code Online (Sandbox Code Playgroud)


kin*_*all 7

zlists = [[0] * i for i in range(10)]
Run Code Online (Sandbox Code Playgroud)

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

  • 这还有另一个问题,由于引用的工作方式,这有点微妙:`a=zlists[3]; a.追加[5];b=zlists[3]; print b` 输出 `[0, 0, 0, 5]`。`b` 并不是一个由零组成的列表,正如人们可能天真地期望的那样! (2认同)
  • `def zeroes(n):return [0]*n`后跟`a = zeroes [3]; a.append [5]; B =零[3]; print b`输出`[0,0,0]`.我只是向读者指出它不像工厂那样工作. (2认同)

Lel*_*uge 5

zeros=[0]*4

您可以将4上面的示例替换为所需的任何数字。


Gav*_*egg 5

如果您想要一个将在列表中返回任意数量的零的函数,请尝试以下操作:

def make_zeros(number):
    return [0] * number

list = make_zeros(10)

# list now contains: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Run Code Online (Sandbox Code Playgroud)