8

我正在剑桥考试委员会教授 A Level 教学大纲。实用论文中的一个典型问题是:

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

我有这个:

myArray = []        #create the array

for i in range(10): # initializes to 0
    myArray.append(0)

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

类似的东西(伪代码):

myArray[10] : integer

这是一个非商业问题,而是一个教育问题。

4

6 回答 6

11

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

import array
a = array.array('i') # Define an integer array.

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

a = array.array('i', [0]*10)

如文档中所述,'i'强制数组的元素为整数。DeprecationWarning如果您尝试在整数数组中插入浮点数,Python 2.6 将抛出 a ,但会将浮点数转换为 int:

>>> a[0]=3.14159
>>> a
>>> array('i', [3, 0, 0, 0, 0, 0, 0, 0, 0, 0])

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

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

只是在np.empty内存中为数组保留了一些空间,并没有对其进行初始化。如果你需要一个 0 的数组,你可以这样做:

a[:] = 0

或直接使用该np.zeros功能

a = np.zeros(10, dtype=int)

同样,在整数数组中插入浮点数会默默地将浮点数转换为整数。

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

于 2012-10-22T11:33:49.293 回答
7

你可以使用数组模块

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)))
于 2012-10-22T11:32:42.150 回答
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]

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

于 2012-10-22T11:30:12.743 回答
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
于 2012-10-22T12:03:58.247 回答
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 效率不高,所以通常没有理由使用静态类型。

于 2012-10-22T11:38:33.880 回答
0

您可以使用数组模块来做到这一点。array 模块是 python 标准库的一部分:

from array import array
from itertools import repeat

a = array("i", repeat(0, 10))
# or
a = array("i", [0]*10)

重复函数将 0 值重复 10 次。它比 [0]*10 更节省内存,因为它不分配内存,而是重复返回相同的数量 x 次。

于 2019-01-18T15:01:21.763 回答