8

私はケンブリッジ試験委員会でAレベルのシラバスを教えています。実用的な紙の1つの典型的な質問はこれです:

選択したプログラミング言語で、10個の整数の配列を宣言してから、それを初期化します。

私はこれを持っています:

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.

次に、必要な要素を配列に追加できます。ただし、配列のサイズを事前に定義できるかどうかはわかりません。各要素がゼロである10個の整数要素の配列が必要な場合は、次のように実行できます。

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

ドキュメントで説明されているように、'i'力は配列の要素を整数にします。DeprecationWarningPython 2.6は、整数の配列にfloatを挿入しようとすると、をスローしますが、floatをintとしてキャストします。

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

または、配列のサイズとタイプの両方を定義できるnumpyパッケージを使用することもできます。

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)

ここでも、整数の配列にfloatを挿入すると、floatがサイレントに整数に変換されます。

numpyと:の違いに注意してくださいarray。で配列を定義すると、配列numpyを再作成せずにそのサイズを変更することはできません。その意味で、「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

これは、リストを初期化するためのよりPython的な方法です。

>>> 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

あなたは配列モジュールを使用してそれを行うことができます。配列モジュールは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 に答える