【问题标题】:List of zeros in python [duplicate]python中的零列表[重复]
【发布时间】:2012-01-21 15:01:56
【问题描述】:

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

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

[0,0,0,0]

对于7

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

【问题讨论】:

  • 对于大型数值数组,您应该使用numpy,它有一个zeros 函数来执行此操作。
  • 列表理解:[0 for i in range(7)] 或除7 以外的任何整数。

标签: python


【解决方案1】:
$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 零的列表。

See why [] is faster than list()

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

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

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

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

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

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

【讨论】:

  • 你能解释一下为什么在可变对象的情况下这是一个问题吗?所以在整数中,虽然它们是不可变的,因为元素引用相同的 id 不是所有元素都是相同的整数吗?
  • 您会期望,当您创建一个列表列表时,所有列表都彼此不同,而它们实际上是对同一个列表的引用。这与整数无关,因为您无法在 Pyhton 中更改整数(或字符串)的值。当您执行a = a + 1 之类的操作时,您会得到一个新的id 用于a + 1,而不是更改id(a) 的原始值。
  • 问题抓住了我。为了创建一个零列表列表(当 numpy 不是一个选项时),这就是我想出的:p_ij = [[0] * k for i in range(k)] 这样它就不会共享 ID,而当你进行诸如 p_ij[2][3] 之类的分配时,它会'不要将它分配给第三个元素的所有行。
【解决方案2】:
#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]
>>> 

【讨论】:

  • 我想这是其他一些东西的汇编,但它把它们放在一起,正如网站所说,“我们只是来帮忙”(或类似的东西)。
  • 只做return [0] * n,因为listofzeros是一个填充变量。
  • 函数式编程的美妙运用
  • 当心你是否对非原始类型执行此操作。 [{ }] * 5 将列出对同一字典的 5 个引用。
  • 这个语法是非正式的,需要Python升级。
【解决方案3】:
$ python3
>>> from itertools import repeat
>>> list(repeat(0, 7))
[0, 0, 0, 0, 0, 0, 0]

【讨论】:

    【解决方案4】:

    这里是 xrange 方式:

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

    【讨论】:

      【解决方案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]
      

      【讨论】:

        【解决方案6】:
        zlists = [[0] * i for i in range(10)]
        

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

        【讨论】:

        • 这是个好主意,但它不适用于长度超过 9 个零的列表。很容易补救(尽管它永远不会对任意列表起作用),但是你会遇到一个更大的问题,那就是它在内存中存储了 T_N 零。最好使用工厂函数,正如 Ben 在他接受的答案中所做的那样。
        • 这里还有另一个问题,由于引用的工作方式,这有点微妙:a=zlists[3]; a.append[5]; b=zlists[3]; print b 输出[0, 0, 0, 5]b 不是一个零列表,正如人们可能天真地期望的那样!
        • 问题是列出零列表。我的回答就是这样。至于你的第二个“问题”——无论你如何列出清单,你都会遇到同样的问题。
        • def zeroes(n): return [0]*n 后跟 a=zeroes[3]; a.append[5]; b=zeroes[3]; print b 输出 [0, 0, 0]。我只是向读者指出,它不像工厂那样运作。
        【解决方案7】:

        zeros=[0]*4

        您可以将上面示例中的4 替换为您想要的任何数字。

        【讨论】:

          【解决方案8】:

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

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

          所以对于你的循环:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-01-24
            • 1970-01-01
            • 2017-05-28
            • 2013-03-03
            • 1970-01-01
            • 1970-01-01
            • 2023-04-09
            • 1970-01-01
            相关资源
            最近更新 更多