Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
今回はPythonのリストのうち、「数値だけ(整数や小数など)」を要素とするリストを作れる便利なarrayモジュールについて、その基本的な使い方の解説です。
なおarray(アレイ)とはプログラミング業界では「配列」を意味することが多いようですが、今回の記事ではPythonのarrayモジュールで作るarrayオブジェクトの意味で考えてください。
Contents
まず通常のリストオブジェクトとの違いを見てみましょう。Pythonの通常のリストは、
def f():
pass
num = 3.141592
normal_list: list = [1, "2", "三", "よん", num, f]
このnormal_listのように、リストの要素として様々な型のオブジェクトを入れることができます。これは便利で自由度が高いというメリットがありますが、コーディングのときのうっかりミスやそれによるエラーを引き起こす可能性が高くなるというデメリットもあります。
そこで、リストの要素として一定の決まった型のオブジェクトしか使えないという、要素の型が制限されたリストを作りたい場合が出てきます。特に「数値だけ」を要素とするリストはよく使われるため、数値だけを要素とするというルールのリストを作りたいものです。
そんな要望に応えるのがarrayモジュールです。ではそれの基本的な使い方を見ていきましょう。
基本的な使い方ですが、そもそもモジュールですのでインポートしてから、インスタンスを作成するという2つのステップを踏むことになります。次がその例です。
import array as arr
a: list = [8.0, 9.01, 10.543, 11, 12.23, 13.90, 14.00, 15.099999]
# 通常のリストとは違い、リスト内部の型を明確に指定・制限できる。それ以外は通常のリストと同じ
numbers: arr.array = arr.array('f', a)
この5行目ですが、
という処理です。
このarr.arrayの部分ですが、それを定義しているクラスは次のようになっています。
class array.array(①, ②(省略可))
この引数の①と②は、
がそれぞれ入ります。
①の型コードというのは上公式ページにあるこの表にあるものです。これから適切なコードを選びます。
型コード C の型 Python の型 最小サイズ (バイト単位) 注釈 'b'
signed char int 1 'B'
unsigned char int 1 'u'
wchar_t Unicode文字(unicode型) 2 (1) 'h'
signed short int 2 'H'
unsigned short int 2 'i'
signed int int 2 'I'
unsigned int int 2 'l'
signed long int 4 'L'
unsigned long int 4 'q'
signed long long int 8 'Q'
unsigned long long int 8 'f'
浮動小数点数 浮動小数点数 4 'd'
double 浮動小数点数 8
上のコード例では、「’f’」をしているので、浮動小数点数がリストの要素であるというルールが決められています。
さて上のコード例で作ったnumbersですが、それを表示させてみましょう。
print(numbers)
結果は、
array('f', [8.0, 9.010000228881836, 10.543000221252441, 11.0,
12.229999542236328, 13.899999618530273, 14.0, 15.09999942779541])
となります。ただの小数から、浮動小数点という数へ変化しているのがわかると思います。
ではこのnumbersというarrayの要素数(長さ)はどうなっているでしょうか、
print(len(numbers))
実行結果は、
8
となり。8個の要素が数えられています。つまり、array(‘f’, リスト)の「’f’」という型コードの部分は含まれていないわけですね。実際、
print(numbers[0])
とすれば、
8.0
と表示されます。これは第2引数として指定したイテラブルオブジェクトであるリストの最初の要素です。
さてこのarrayモジュールには、いくつもの便利なメソッドが用意されいます。それを使ってみましょう。
numbers.reverse()
print(numbers)
結果は、
array('f', [15.09999942779541, 14.0, 13.899999618530273, 12.229999542236328, 11.0, 10.543000221252441, 9.010000228881836, 8.0])
上述のように型コードの部分は別として、イテラブルオブジェクトであるリストの部分が変化していますね。要素の並びが逆になっています。
では上で逆順に並び替えたnumbersから、特定の要素を指定してその要素のインデックス番号を取得してみましょう。indexメソッドを使います。
print(numbers.index(10.543000221252441))
結果は、
5
ここで注意したいのは、最初のリストオブジェクトaでは、「10.543」だった要素が、arrayオブジェクトにおいてはすでに「10.543000221252441」へと変わってしまっているという点です。よって、indexの引数には「10.543000221252441」を指定します。こうしないと要素が見つからずエラーとなります。
このindexは、スライス機能を使って、検索する範囲を指定できます。 同じく逆順に並び替えたnumbersを前提として、
print(numbers.index(11, 3, 8))
これは、逆順になったnumbersのインデックス番号3~同7(最後の8は含まれません)までという範囲を指定して、11という数字を探し、それが見つかればそのインデックス番号を返すという処理です。
結果は、
4
となります。
他にも通常のリストでもよく使うappendが、このarrayモジュールでも用意されています。
b: list = [1, 2, 3, 4, 13001111111, "Apple", 'hello \u2641', 10] # 13001111111 is over 1 bite # 13001111111 is over 1 bite
arr_list: arr.array = arr.array('b', [])
for i in b:
arr_list.append(i)
print(arr_list)
この処理の内容ですが、1行目では通常のリストを作成しています。
2行目では、空のリストを持つarray.array型のオブジェクトarr_listを作っています。そしてそのリストに入るオブジェクトの型コードとして「’b’」が指定され、これは、C言語の1バイトの長さまでの符号付きchar型(文字型)しか要素にできないという指定です。上の型コード表を見てください。
5つ目の要素「13001111111」はPythonでは普通のint型(整数型)ですが、これはその「’b’」という指定では対応できないデータのためOverflowErrorが出ます。そのためそこでfor文の処理が止まります。そのため実行結果は、
array('b', [1, 2, 3, 4])
となります。通常のリストのappendは通常のリスト型のオブジェクトを返しますが、このarrayモジュールでのappendは、あくまでarray.arrayという型のオブジェクトを返すものだという点に注意しましょう。
他にもいろいろなメソッドが用意されていますので、上の公式ページで見て試してみてください。