ユーニックス総合研究所

  • home
  • archives
  • python-array

Pythonのarrayの使い方【型付きのリスト】

  • 作成日: 2021-05-20
  • 更新日: 2023-12-24
  • カテゴリ: Python

Pythonのarrayの使い方

Pythonにはarrayというモジュール(外部ライブラリ)があります。
arrayは一言で言うと「型を指定できるリスト」です。

この記事ではarrayの使い方をわかりやすく解説します。
結論から言うとarrayは↓のように使います。

import array  

arr = array.array('B')  # unsigned char型の配列を生成  

arr.append(1)  
arr.append(2)  

print(arr)  
# array('B', [1, 2])  

arrayについて具体的に↓を見ていきます。

  • arrayの大まかな使い方
  • arrayの型コード(typecode)
  • 要素1つのサイズ(itemsize)
  • 配列を作成する
  • 添え字で要素を参照する
  • for文で回す
  • 配列の長さを得る
  • append()で要素を追加
  • extend()で配列を拡張
  • fromlist()でリストを取り込む
  • insert()で要素を挿入
  • pop()で要素を削除
  • tolist()でリストに変換
  • 型のオーバーフロー
  • 型のタイプエラー

arrayの大まかな使い方

arrayは簡単に言うと「型の付いたリスト」です。
arrayにはtypecode(型コード)と呼ばれる型を指定することができます。

arrayを使うには最初にarrayモジュールをインポートします。

import array  

array.array()で型付きの配列を作成することができます。

配列はその型のサイズの要素を持ちます。
型のサイズからはみ出たサイズの要素を追加しようとするオーバーフローエラーになります。
そのためarrayに要素を追加したり挿入したりしようとする場合は、型の範囲内で行わなければいけません。

型以外はほとんどリストと同じ使い方ができます。
for文でも回せますし、append()pop()などお馴染みのメソッドもあります。

arrayの型コード(typecode)

arrayに指定できる型コード(typecode)は↓の通りです。

型コード 型(C言語) 型(Python) 型の最小バイト数

'b'

signed char

int

1

'B'

unsigned char

int

1

'u'

wchar_t

Unicode文字(unicode型)

2

'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

↑の型をarray.array()の第1引数に指定することができます。
↓のようにです。

import array  


arr1 = array.array('B')  # unsigned char (符号なし文字)  
print(arr1)  
# array('B')  

arr2 = array.array('i')  # signed int (符号付き整数)  
print(arr2)  
# array('i')  

arr3 = array.array('d')  # double (倍精度浮動小数点数)  
print(arr3)  
# array('d')  

↑のarr1unsigned char型の配列、arr2signed int型の配列、arr3double型の配列になります。
arrayは型コードの型を内部で保持します。
arrayは↑のように型を指定してオブジェクトを生成するのが特徴的です。

先ほどの↑の表の一覧ですが、型のサイズは最小サイズであることに注意が必要です。
つまりsigned intなどは環境によっては4バイトになることがあります。

要素1つのサイズ(itemsize)

arrayの要素1つ分のサイズは、array.arrayの属性itemsizeで取得できます。

arr1 = array.array('B')  # usigned char (1バイト)  
print(arr1.itemsize)  
# 1  

arr2 = array.array('i')  # signed int (2バイト ~ 4バイト)  
print(arr2.itemsize)  
# 4  

筆者の環境はWindows10の64ビットCPUですが、その環境だと↑のようにsigned int4バイトになります。

配列を作成する

arrayで配列を作成するにはarray.array()を使います。
array.array()は↓のような構造になっています。

array.array(型コード, 初期値)  

↑の内、初期値は省略することができます。
省略した場合は空の配列が作成されます。

arr = array.array('i')  
print(arr)  
# array('i')  
print(len(arr))  
# 0  

初期値を指定した場合はその初期値で配列が初期化されます。

arr = array.array('i', [1, 2, 3])  
print(arr)  
# array('i', [1, 2, 3])  
print(len(arr))  
# 3  

初期値の値は型の範囲内のサイズである必要があります。
型の範囲外のサイズである場合は例外OverflowErrorが送出されます。

try:  
    arr = array.array('B', [-1])  
except OverflowError as e:  
    print(e)  
    # unsigned byte integer is less than minimum  

添え字で要素を参照する

配列はリストと同じように、角カッコと添え字でその添え字の要素を参照することができます。

arr = array.array('i', [1, 2, 3])  
print(arr[0])  
# 1  
print(arr[1])  
# 2  
print(arr[2])  
# 3  

for文で回す

配列はfor文で回すことができます。

arr = array.array('i', [1, 2, 3])  

for el in arr:  
    print(el)  
    # 1  
    # 2  
    # 3  

配列の長さを得る

配列はlen()でその長さを得ることができます。

arr = array.array('i', [1, 2, 3])  

print(len(arr))  
# 3  

append()で要素を追加

arrayの末尾に要素を追加したい場合はappend()を使います。
append()の第1引数に追加したい要素を指定します。

arr = array.array('i')  

arr.append(1)  
arr.append(2)  
arr.append(3)  

print(arr)  
# array('i', [1, 2, 3])  

extend()で配列を拡張

arrayにリストや別のarrayを繋げたい場合はextend()を使います。

arr = array.array('i')  

arr.extend([10, 20])  
arr.extend([3, 4, 5])  

print(arr)  
# array('i', [10, 20, 3, 4, 5])  

↑の例ではsigned int型のarrayにリストを連結しています。
arrayarrayに連結する場合は型を同じにする必要があります。

arr1 = array.array('i', [1, 2])  
arr2 = array.array('i', [1, 2, 3])  

arr1.extend(arr2)  
print(arr1)  
# array('i', [1, 2, 1, 2, 3])  

fromlist()でリストを取り込む

fromlist()で配列にリストを連結することができます。

arr = array.array('i')  

arr.fromlist([10, 20])  
arr.fromlist([3, 4])  

print(arr)  
# array('i', [10, 20, 3, 4])  

insert()で要素を挿入

配列に要素を挿入するにはinsert()を使います。
insert()の第1引数に挿入位置、第2引数に値を指定します。

arr = array.array('i')  

arr.insert(0, 10)  
arr.insert(0, 20)  

print(arr)  
# array('i', [20, 10])  

pop()で要素を削除

配列の末尾の要素をポップ(削除して取得)するにはpop()を使います。

arr = array.array('i', [1, 2, 3])  
el = arr.pop()  
print(arr)  
# array('i', [1, 2])  
print(el)  
# 3  

pop()の第1引数に添え字を指定すると、その添え字の要素をポップできます。

arr = array.array('i', [1, 2, 3])  
el = arr.pop(0)  
print(arr)  
# array('i', [2, 3])  
print(el)  
# 1  

tolist()でリストに変換

tolist()で配列をリストに変換できます。

arr = array.array('i', [1, 2, 3])  
lis = arr.tolist()  
print(lis)  
# [1, 2, 3]  

型のオーバーフロー

array全般に言えることですが、挿入などを行う場合、値のサイズが範囲外だと例外OverflowErrorが送出されます。

arr = array.array('B')  

try:  
    arr.insert(0, -1)  
except OverflowError as e:  
    print(e)  
    # unsigned byte integer is less than minimum  

↑の場合、型コードのBunsigned charを表しています。
unsigned charは符号なしの1バイトです。つまり負数を表現できません。
insert()で↑のように負数を挿入しようとすると↑のようなOverflowErrorが発生します。

型のタイプエラー

これもarray全般に言えることですが、型が違う場合は例外TypeErrorが送出されます。
たとえばextend()で型の違う配列同士を連結しようとすると↓のようになります。

arr1 = array.array('i', [1, 2])  
arr2 = array.array('d', [1, 2, 3])  

try:  
    arr1.extend(arr2)  
except TypeError as e:  
    print(e)  
    # can only extend with array of same kind  

おわりに

今回はPythonのarrayをまとめてみました。
基本的にはリストと同じノリで使えるモジュールのようです。

🦝 < 型は人生を豊かにする