[データ構造] Pythonでの配列

配列 複数の要素(値)の集合を格納・管理するのに用いられるデータ構造が配列である。数学のベクトルおよび行列に近い概念であり、実際にベクトルおよび行列をプログラム上で表現する場合に配列が使われることが多い。同様に複数要素の集合を管理するデータ構造(コレ...

Python には配列はビルトインとしては存在しません。

配列ではなく、同一の型でなければならないという配列の制約を取り払った「リスト」と言われるデータ構造が使われます。

少しややこしいですが、Python のリストは一般的な “Linked List” ではなく、型の制約のない「配列」です。

CPythonでは、リストの最後への要素の追加は\( O (1) \)、リストの途中への要素の挿入は\( O (N) \)、リストの最後の値の削除は\( O (1) \) 、 リストの途中の要素の削除は\( O (N) \)と、配列と同じように実装されています。

Python list implementation

ちなみに、型の制約のある配列を使いたいときは、array というモジュールを使うことができます。

array — 効率のよい数値アレイ

または、numpy を用いることもできます。

Array creation

リスト

リスト型 (list)

Python のリストを使ってみます。

以下のようなリストを作成します。

>>> nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> nums
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

それぞれの要素にはインデックス(添え字)を用いて\( O (1) \) でランダムアクセスできます。

>>> nums[0]
0
>>> nums[1]
1
>>> nums[5]
5
>>> nums[2] = 20
>>> nums
[0, 1, 20, 3, 4, 5, 6, 7, 8, 9]

Python の配列(リスト)は、一般的な配列と異なり型の制約がないので、同一配列内に異なる型の値を持つことができます。

>>> nums[2] = '二十'
>>> nums
[0, 1, '二十', 3, 4, 5, 6, 7, 8, 9]
>>>

リストでループを回します。

>>> nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> 
>>> for num in nums:
...     print(num)
... 
0
1
2
3
4
5
6
7
8
9

range を使い、インデックスでループを回します。

>>> nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> 
>>> for index in range(len(nums)):
...     print(nums[index])
... 
0
1
2
3
4
5
6
7
8
9

スライスを使い、配列の一部にアクセスできます。

>>> nums[:2]
[0, 1]
>>> nums[2:7]
[2, 3, 4, 5, 6]
>>> nums[3:-1]
[3, 4, 5, 6, 7, 8]
>>> nums[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

ループを使い、配列の最大値を取得します。

>>> nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> max_num = nums[0]
>>> for num in nums:
...     if num > max_num:
...         max_num = num
... 
>>> max_num
9

このように、配列では、インデックスが分からない要素を探索する場合、最初から最後まで全ての要素を確認する必要がり、計算量は\( O (N) \) になります。

よって、値の探索を多く行う時は、データ構造は配列と比較して複雑になりますが、探索の計算量が\( O ( \log N)\)である2分探索や \( O (1) \)である連想配列を使うことができます。

連結リスト 連結リスト(れんけつリスト、英語:Linked list)は、最も基本的なデータ構造の1つであり、他のデータ構造の実装に使われる。リンクリスト、リンクトリストとも表記される。 出典: フリー百科事典『ウィキペディア(Wikipedia)』...