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

时间:2012-10-22 11:26:12

标签: python

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

  

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

我有这个:

myArray = []        #create the array

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

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

像(伪代码):

myArray[10] : integer

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

6 个答案:

答案 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)

您可以使用array模块进行操作。数组模块是python标准库的一部分:

from array import array
from itertools import repeat

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

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