如何在不从不同容器复制值的情况下初始化python数组?

如何在不从不同容器复制值的情况下初始化python数组?,python,arrays,python-3.x,Python,Arrays,Python 3.x,下面的代码片段显示了如何从各种容器类(元组、列表、字典、集合等)初始化python数组 从范围(100)初始化的数组特别好,因为迭代器不需要存储100个元素。它可以简单地存储当前值和一个转换函数,描述如何从当前值计算下一个值(每次调用\uuuuuuuuuuuuuuuuuu时将一个值添加到当前值) 但是,如果数组的初始值不遵循简单的模式,例如向上计数0、1、2、3、4、…、99,该怎么办?迭代器可能不实用。创建一个列表,将列表复制到数组中,然后删除列表是没有意义的。实际上,您已经创建了两次数组,并

下面的代码片段显示了如何从各种容器类(元组、列表、字典、集合等)初始化python数组

范围(100)
初始化的数组特别好,因为迭代器不需要存储100个元素。它可以简单地存储当前值和一个转换函数,描述如何从当前值计算下一个值(每次调用
\uuuuuuuuuuuuuuuuuu
时将一个值添加到当前值)

但是,如果数组的初始值不遵循简单的模式,例如向上计数0、1、2、3、4、…、99,该怎么办?迭代器可能不实用。创建一个列表,将列表复制到数组中,然后删除列表是没有意义的。实际上,您已经创建了两次数组,并且不必要地复制了它。是否有办法通过传入初始值直接构造数组?

来自python文档():

类array.array(类型代码[,初始值设定项])

一个新数组,其项受类型码限制,并从可选初始值初始化,该值必须是列表、类似字节的对象或可在适当类型的元素上进行初始化


因此,您似乎被限制在传递初始python容器中。

假设初始元素可以从逻辑上派生,您可以将a作为初始值设定器传递。生成器在迭代时生成元素,类似于
range

>>> def g():
...     for _ in range(10):
...         yield random.randint(0, 100)
... 
>>> arr = array.array('h', g())
>>> arr
array('h', [47, 6, 91, 0, 76, 20, 77, 75, 46, 7])
对于简单的情况,可以使用:

>>> arr = array.array('h', (random.randint(0, 100) for _ in range(10)))
>>> arr
array('h', [72, 30, 40, 58, 77, 74, 25, 6, 71, 58])

如果您担心额外的副本,那么Python可能不是适合您的语言。即使可以执行类似于
array.array('h',5,2,3,14)
的操作来创建一个包含初始内容
5,2,3,14
的数组,作为函数调用机制的一部分,
array.array
的参数将被打包到一个元组中,并且您将执行从元组到数组的“不必要”复制。
>>> arr = array.array('h', (random.randint(0, 100) for _ in range(10)))
>>> arr
array('h', [72, 30, 40, 58, 77, 74, 25, 6, 71, 58])