我正在剑桥考试委员会教授A Level课程。实际论文中的一个典型问题是:
在您选择的编程语言中,声明一个包含十个整数的数组,然后对其进行初始化。
我有这个:
myArray = [] #create the array
for i in range(10): # initializes to 0
myArray.append(0)
我相信这是大多数人在Python中会做的事情?然而,与Pascal等不同,它并没有严格地回答这个问题,因为Python中的列表本质上是动态数组,并且增加了不限制每个元素的数据类型的问题。我可以声明一个特定大小的数组并在Pascal中输入,而不是一个空的动态列表,没有任何类型的循环并限制数组的类型吗?
像(伪代码):
myArray[10] : integer
这是一个非商业性的问题,但是一个教育问题。
答案 0 :(得分:11)
您可以尝试使用array
module指定数组的类型:
import array
a = array.array('i') # Define an integer array.
然后,您可以将所需的元素添加到数组中。不过,我不确定你是否可以预定义数组应该具有的大小。如果你想要一个包含十个整数元素的数组,每个元素为零,你可以这样做:
a = array.array('i', [0]*10)
如文档中所述,'i'
强制数组的元素为整数。如果你试图在一个整数数组中插入一个浮点数,Python 2.6将抛出一个DeprecationWarning
,但是会将浮动转换为int:
>>> a[0]=3.14159
>>> a
>>> array('i', [3, 0, 0, 0, 0, 0, 0, 0, 0, 0])
或者,您可以使用numpy
package,它可以让您定义数组的大小和类型。
import numpy as np
a = np.empty(10, dtype=int) # Define a integer array with ten elements
np.empty
只是在内存中为数组预留了一些空间,它没有初始化它。如果你需要一个0的数组,你可以这样做:
a[:] = 0
或直接使用np.zeros
function:
a = np.zeros(10, dtype=int)
再次,在一个整数数组中插入一个float会静默地将float转换为整数。
注意numpy和array
之间的区别:一旦在numpy
中定义了一个数组,就无法在不重新创建数组的情况下更改其大小。从这个意义上讲,它满足了你对“10和10个整数”的要求。相比之下,array.array
对象可以看作具有固定元素类型的列表:数组是动态的,您可以增加它的大小。
答案 1 :(得分: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]
当然,这并没有回答如何创建像受限元素列表这样的非pythonic事物的问题。
答案 2 :(得分:6)
您可以使用array module
a = array.array('i',(0 for _ in xrange(10)))
数组要求所有元素都是相同的类型,如创建时指定的那样。但它们仍然可以附加到
如果您确定,可以使用ctypes模块构建C数组。但是,这可能不是非常pythonic,因为它迫使你做更多低级别的东西。
import ctypes
intArray10 = ctypes.c_int * 10
myArray = intArray10(*(0 for _ in xrange(10)))
答案 3 :(得分:2)
正如已经提到的那样l = [0] * 10
初始化一个包含10个零的列表。
虽然可以添加更多元素,但你不能错误地这样做。
>>> l = [0] * 10
>>> l[10] = 1
Traceback (most recent call last):
l[10] = 1
IndexError: list assignment index out of range
如果要将追加添加到列表中,则需要调用.append()
或其他添加新元素的方法。因此,您无法偶然添加元素,您需要明确。
在许多其他语言中,您只需将数组替换为具有不同大小的数组即可。重点是,你可以经常找到解决这些限制的方法,我认为只使用最简单的工作并且很好理解是件好事。
对我来说,那就是
>>> l = [0] * 10
答案 4 :(得分:0)
class myTypedArray:
def __init__(self,mytype):
self._internalList = []
self._internalType = mytype
def add(self,x):
if type(x) == self._internalType:
self._internalList.append(x)
#else raise an Error to warn User of typedArray
def __str__(self):
s = ""
for x in self._internalList:
s+=str(x)
return s
x = myTypedArray(int)
x.add(1)
x.add("xyz") # will not be added
print x # output: 1
如果要限制大小,可以跟踪大小并抛出异常。因此,您可以看到,扩展Python中的类型非常容易。静态类型语言(如C)的重点是更接近硬件。此示例myTypedArray效率不高,因此通常没有理由使用静态类型。
答案 5 :(得分:0)