この記事では、Pythonの配列を作り方や処理方法を解説していきます。
そもそも、Pythonに配列はあるの?
結論から言うと、Pythonのarrayモジュールを使えば、整数、浮動小数点、Unicode文字用の配列を作成することができます。
Pythonはデフォルトでは、配列のデータ構造を持っていません。
多くの場合は、配列と同じことがリストで行うことができるからです。
リストはアイテムのコレクションを含み、追加/更新/削除/検索などの処理ができます。
配列は整数だったら整数だけ、文字列だったら文字列だけを要素に入れることができますが、Pythonのリストは異なる型の要素を入れることができます。
つまり、リストの方が配列よりも柔軟に扱えることが多いのです。
Python arrayモジュール
Pythonのarrayモジュールは、「整数だけしか要素に入れない」等の様に、データ型に制約のある配列を作成することができます。
詳しくは後述しますが、Pythonで配列を作成する時はarray.array("i", [1, 3, 4])
の様に、第1引数に配列の型を入れて、第2引数に配列となるリストを入れます。
(どのような型が使えるかは、公式ドキュメントが詳しいです)
そのため、arrayモジュールを使って整数とか浮動小数点数の配列を作成することができます。
さっそくarrayモジュールが提供するすべての操作を見てみましょう。
1. 配列の作成
配列を作成する際には、array
モジュールをインポートした後に、array.array(typecode, values_list)
を使います。
import array
# 配列の作成
int_array = array.array('i', [ 1 , 2 , 3 , 4])
float_array = array.array('f', [ 1.1 , 2.2 , 3.3 , 4.4])
# ユニコード文字列
unicode_array = array.array('u', ['u0394' ,'u2167' ,'u007B'])
2. 配列とその型を出力する
配列オブジェクトを表示すると、型の情報とその要素に関する情報を得ることができます。
上で作成した配列を出力し、さらに組み込み関数のtype()を使ってオブジェクトの型を出力してみましょう。
# printing array
print(int_array)
print(float_array)
print(unicode_array)
print(type(int_array))
結果は以下の様になります。
array('i', [ 1 , 2 , 3 , 4])
array('f', [ 1.100000023841858 , 2.200000047683716 , 3.299999952316284 , 4.400000095367432])
array('u','ΔⅧ{')
3. 配列の要素にアクセスする
forループを使って、配列の要素を表示することができます。
import array
int_array = array.array('i', [ 1 , 2 , 3 , 4])
for a in int_array:
print(a)
また、インデックスを使用して要素にアクセスすることもできます。
インデックスを使用して、配列の要素を表示することができます。
for b in range(0 , len(int_array)):
print(f'int_array[{b}] = {int_array[b]}')
結果は以下の通り
int_array[0] = 1
int_array[1] = 2
int_array[2] = 3
int_array[3] = 4
この記事もチェック:Pythonの配列をNumpyやforループを使って初期化する3つの方法
4. 配列に要素の挿入と追加をする
Pythonの配列は、insert()メソッドを使用すると、指定したインデックスに要素を挿入することができます。
指定されたインデックスからの要素は、1つ右にシフトされます。
int_array = array.array('i', [ 1 , 2 , 3 , 4])
int_array.insert(0 , -1) # -1,1,2,3,4
int_array.insert(2 , -2) # -1,1,-2,2,3,4
print(int_array)
結果は、以下の通りになります。
('i', [-1, 1, -2, 2, 3, 4])
配列の末尾に要素を追加する場合は、append()メソッドを使用します。
int_array = array.array('i', [ 1 , 2 , 3 , 4])
int_array.append(-3)
print(int_array) # array('i', [1, 2, 3, 4, -3])
5. マイナスのインデックスを使って配列の要素にアクセス「
配列のインデックスにマイナスを使う事で、配列の末尾から何番目かの要素にアクセスできます。
以下のコードの例を見てもらうと分かりやすいです。
int_array = array.array('i', [ 10 , 20 , 30 , 40 , 50 , 60 , 70 , 80])
print(int_array[-2]) # 70
print(int_array[-5]) # 40
6. 配列の要素の削除
配列の要素を削除するには、remove() メソッドを使用します。
int_array = array.array('i', [ 1 , 2 , 3 , 4])
int_array.remove(2)
print(int_array) # array('i', [1, 3, 4])
要素が配列に存在しない場合、ValueErrorが発生します。
int_array = array.array('i', [ 1 , 2 , 3 , 4])
try:
int_array.remove(20)
except ValueError as ve:
print(ve)
結果は、以下の通りになります。
上記の例では例外が発生するはずです。
また、pop()メソッドを使用して、指定したインデックスの要素を削除することができます。
このメソッドは、戻り値として配列から削除される要素を返します。
インデックスを指定しない場合は、最後の要素が削除されて返されます。
int_array = array.array('i', [ 1 , 2 , 3 , 4])
last_element = int_array.pop()
print(last_element) # 4
print(int_array) # array('i', [1, 2, 3])
second_element = int_array.pop(1)
print(second_element) # 2
print(int_array) # array('i', [1, 3])
7. 配列をslice(スライス)で部分的に取得する
Pythonの配列はスライスをサポートしており、サブ要素を含む新しい配列を返します。
元の配列は変更されません。
また、スライスは負のインデックスをサポートしています。
int_array = array.array('i', [ 0 , 1 , 2 , 3 , 4 , 5])
print(int_array[3:])# array('i', [3, 4, 5])
print(int_array[:2])# array('i', [0, 1])
print(int_array[1:3])# array('i', [1, 2])
# マイナスのインデックスのスライス
print(int_array[-2:]) # array('i', [4, 5])
print(int_array[:-2]) # array('i', [0, 1, 2, 3])
この記事もチェック:PythonのNumPyでの配列の作成やスライス、変更について解説する
8. 配列の要素を検索する
index()メソッドを使うと、ある要素が最初に出現するインデックスを見つけることができます。
もしその要素が配列に存在しない場合は、ValueError が発生します。
int_array = array.array('i', [ 0 , 1 , 2 , 3 , 1 , 2])
print(f'1 is found at index {int_array.index(1)}')
try:
print(int_array.index(20))
except ValueError as ve:
print(ve)
結果は以下の通りでうs
1 is found at index 1
array.index(x): x not in array
9. 指定したインデックスの値を更新する
配列のインデックスを代入演算子で使用して、インデックスにある値を更新することができます。
インデックスが無効な場合、IndexError が発生します。
int_array = array.array('i', [ 0 , 1 , 2 , 3 , 1 , 2])
int_array[0] = -1
int_array[1] = -2
print(int_array)
try:
int_array[ 10 ] =- 10
except IndexError as ie:
print(ie)
結果は以下の通りです
array('i', [-1 , -2 , 2 , 3 , 1 , 2])
array assignment index out of range
この記事もチェック:Numpyのブール配列の作成、演算、インデックス等を解説する
10. 配列を判定させる
reverse()メソッドを使って、配列の要素を反転させることができます。
int_array = array.array('i', [ 0 , 1 , 2 , 3])
int_array.reverse()
print(int_array) # array('i', [3, 2, 1, 0])
この記事もチェック:ブール配列の要素を反転させる
11. ある要素の出現回数を取得する
count()メソッドを使用して、配列内のある値の出現回数を取得することができます。
int_array = array.array('i', [ 0 , 1 , 1 , 0])
print(int_array.count(1)) # 2
print(int_array.count(10)) # 0
12. 配列同士を結合させる
extend()関数を使うと、イテレートから配列の末尾に値を追加することができます。
array1 = array.array('i', [ 0 , 1])
array2 = array.array('i', [ 2 , 3 , 4])
array1.extend(array2)
print(array1) # array('i', [0, 1, 2, 3, 4])
print(array2) # array('i', [2, 3, 4])
array2.extend([1 , 2])
print(array2) # array('i', [2, 3, 4, 1, 2])
array1 = array.array('i', [ 1])
array1.extend(set([0 , 0 , 0 , 2]))
print(array1) # array('i', [1, 0, 2])
13. 配列からリストへの変換
tolist()メソッドを使うと、配列をリストに変換することができます。
int_array = array.array('i', [ 0 , 1 , 2 , 3])
print(int_array.tolist()) # [0, 1, 2, 3]
この記事もチェック:Pythonのmaxメソッドを使ってリストや配列の最大値を求める方法