你能在Python中创建传统的固定长度和类型数组吗?

Tim*_*man 8 python

我正在剑桥考试委员会教授A Level课程.实际论文中的一个典型问题是:

在您选择的编程语言中,声明一个包含十个整数的数组,然后对其进行初始化.

我有这个:

myArray = []        #create the array

for i in range(10): # initializes to 0
    myArray.append(0)
Run Code Online (Sandbox Code Playgroud)

我相信这是大多数人在Python中会做的事情?然而,与Pascal等不同,它并没有严格地回答这个问题,因为Python中的列表本质上是动态数组,并且增加了不限制每个元素的数据类型的问题.我可以声明一个特定的大小数组,并在Pascal中输入,而不是一个空的动态列表,没有任何类型的循环并限制数组的类型?

像(伪代码)的东西:

myArray[10] : integer
Run Code Online (Sandbox Code Playgroud)

这是一个非商业性的问题,但是一个教育问题.

Pie*_* GM 11

您可以尝试使用该array模块指定数组的类型:

import array
a = array.array('i') # Define an integer array.
Run Code Online (Sandbox Code Playgroud)

然后,您可以将所需的元素添加到数组中.不过,我不确定你是否可以预定义数组应该具有的大小.如果你想要一个包含十个整数元素的数组,每个元素为零,你可以这样做:

a = array.array('i', [0]*10)
Run Code Online (Sandbox Code Playgroud)

如文档中所述,'i'强制数组元素为整数.DeprecationWarning如果你试图在一个整数数组中插入一个浮点数,Python 2.6将抛出一个,但是会将浮点数转换为int:

>>> a[0]=3.14159
>>> a
>>> array('i', [3, 0, 0, 0, 0, 0, 0, 0, 0, 0])
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用该numpy,它允许您定义数组的大小和类型.

import numpy as np
a = np.empty(10, dtype=int) # Define a integer array with ten elements
Run Code Online (Sandbox Code Playgroud)

np.empty只保留对阵列中存储一些空间,它不初始化它.如果你需要一个0的数组,你可以这样做:

a[:] = 0
Run Code Online (Sandbox Code Playgroud)

或直接使用np.zeros功能:

a = np.zeros(10, dtype=int)
Run Code Online (Sandbox Code Playgroud)

同样,在一个整数数组中插入一个float会静默地将float转换为整数.

注意numpy和之间的区别array:一旦定义了数组numpy,就不能在不重新创建数组的情况下更改其大小.从这个意义上讲,它满足了你对"10和10个整数"的要求.相比之下,array.array对象可以看作具有固定元素类型的列表:数组是动态的,您可以增加其大小.


小智 6

这是一种更加pythonic的方式来初始化列表:

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

当然,这并没有回答如何创建像受限元素列表这样的非pythonic事物的问题.


Mat*_*att 6

您可以使用阵列模块

a = array.array('i',(0 for _ in xrange(10)))
Run Code Online (Sandbox Code Playgroud)

数组要求所有元素都是相同的类型,如创建时指定的那样.但是,他们仍然可以附加

如果你真的确定了,你可以使用ctypes模块来构建一个C数组.但是,这可能不是非常pythonic,因为它迫使你做更多低级别的东西.

import ctypes
intArray10 = ctypes.c_int * 10
myArray = intArray10(*(0 for _ in xrange(10)))
Run Code Online (Sandbox Code Playgroud)