配列は、プログラミングで複数のデータを順番に並べた構造です。例えば、曜日を管理する場合、配列を使うと効率的に扱えます。配列は「要素」で構成され、各要素は0から始まる添字で参照できます。
配列を使うと、大量のデータを効率的にプログラムの中で扱えるようになります。
コンピュータの専門学校がプログラミング及び、コンピュータの基礎を学び、その後、日本電気の子会社で働きました。その後、いくつかの開発の仕事を経て,コンピュータの専門学校の講師兼担任を経験し、その後はフリーにてシステムエンジニアやプログラマーの開発の仕事を担当、そのかたわらプログラミングスクールや職業訓練所、企業の新人教育などを担当しました。 25年以上のシステムエンジニア、プログラマーの仕事の経験があります。
Python配列とは?定義と基本的な作り方
Pythonの配列(リスト)は、複数のデータが集まったデータ型で、要素に順番があり、追加・削除・書き換えが可能です。値の入っていない配列(リスト)の定義と、配列の要素(値またはデータ)が入っている形での定義の仕方があります。さまざまな操作(追加、削除、検索、並び替えなど)が可能で、柔軟性があります。
リストの基本的な作り方
Pythonでリスト(配列)を宣言する方法について説明します。
- 空(値も値の数も決まっていない。)のリストを作成するには、[]を使います。例えば、l_empty = []とすると、要素数ゼロのリストができます。
- 要素(値またはデータ)入りのリストを作成するには、[1, 2, 3]のようにカンマで区切って値を指定します。要素は異なる型でも構いません。
- 要素数を指定してリストを初期化する場合は、[0] * 10のように*演算子を使います。これにより、すべての要素が0で埋められた10要素のリストができます。
- リスト内包表記を使って複雑な初期化も可能です。例えば、[[0] * 4 for i in range(3)]は3行4列の2次元リストを生成します。※2次元リストについては後程詳しく説明します。
以下、簡単な定義のコード例です。
empty_list = []
# 要素入りの配列を作成
full_list = [1, 2, 3]
Python配列の操作:基本的なメソッド一覧
メソッドというのは、オブジェクトに対する命令のことです。リストはプログラムにおいてオブジェクトという扱いになり、オブジェクト名.メソッド(値)という形でオブジェクトに対する命令(操作)を指定します。
※メソッド=関数という説明をしているサイトもありますが、関数とはちょと違うものです。
以下にリストで使う主なメソッドについて一覧にします。
メソッド名 | 動作 |
append() | リストの末尾に要素を追加します。 |
clear() | リストの要素をすべて削除します。 |
copy() | リストのコピーを作成します。 |
count() | 指定した値の要素数を返します。 |
extend() | 別のリストの要素を現在のリストに追加します。 |
index() | 指定した値の最初の要素のインデックスを返します。 |
insert() | 指定した位置に要素を挿入します。 |
pop() | 指定した位置の要素を削除して返します。 |
remove() | 指定した値を持つ要素を削除します。 |
reverse() | リストの要素を逆順に並べ替えます。 |
sort() | リストを昇順にソートします。 |
以下、詳しく説明します。
要素へのアクセスと取得
配列(リスト)の要素へのアクセスと取得には、厳密にはメソッドではなくインデックスを使います。以下はその例になります。
# 最初の要素(10)
first_element = my_list[0]
# 3番目の要素(30)
third_element = my_list[2]
負のインデックスを使ってのアクセスもできます。
last_element = my_list[-1]
# 末尾から2番目の要素(40)
second_to_last = my_list[-2]
スライスを使っての要素の取得になります。リストの部分的な要素を取得します。
sub_list = my_list[1:4]
要素の追加とリストの結合
配列(リスト)への要素に追加には、いくつかのやり方があります。以下にコードで紹介します。
配列(リスト)の最後に要素を追加するには、メソッドのappendを使います。
l = [0, 1, 2]
#リストの最後に100を追加する
l.append(100)
#リストを出力する
print(l)
#結果は [0, 1, 2, 100]になります。
配列(リスト)の指定した位置に要素を追加するにはメソッドのinsertを使います。
#リストの2つ目に要素を追加します。要素の1番目のインデックスは0になります。
l.insert(1, 100)
#リストを出力する
print(l)
#結果は [‘a’, 100, ‘b’, ‘c’]になります。
配列を結合するには、メソッドのextendを使うか演算子「+=」を使います。
l = [0, 1, 2]
#表を結合する
l.extend([10, 11, 12])
# または l += [10, 11, 12]
#結果を出力
print(l)
#結果は[0, 1, 2, 10, 11, 12]になります。
ここで気を付ける必要がありますが、間違えて、extendを使うと文字列は一文字づつ追加されます。
my_list2 = [‘dog’, ‘cat’]
#表に結合
my_list2.extend(‘bat’)
#結果を出力
print(my_list2)
#結果は[‘dog’, ‘cat’, ‘b’, ‘a’, ‘t’]になります。
なので、appendを使うか
my_list2 = [‘dog’, ‘cat’]
#要素を追加
my_list2.append(‘bat’)
#結果を出力
print(my_list2)
#結果は [‘dog’, ‘cat’, ‘bat’]になります。
結合には「+=」演算子を使います。
string1 = “Hello, ”
#表2を定義する
string2 = “world!”
#表を結合する
result = string1 + string2
#結果を出力
print(result)
#結果は “Hello, world!” になります。
要素の削除
配列(リスト)の要素の削除のメソッドはいくつかあります。以下にその例を紹介します。
removeメソッドを使って、同じ値を持つ要素を削除します。
lang_list = [“Python”, “JavaScript”, “Go”, “PHP”]
#removeメソッドを使って、要素から”Go”の値を削除します。
lang_list.remove(“Go”)
#結果を出力
print(lang_list)
#結果は [‘Python’, ‘JavaScript’, ‘PHP’]になります。
POPメソッドは、指定した位置の要素を取り出して削除します。
ls = [“テスト”, 123, False]
# 0番目の要素を削除
removed_item = ls.pop(0)
#結果を出力
print(ls)
#結果は [123, False]になります。
deiメソッドは、指定した位置の要素を直接に削除します。
my_list = [1, 2, 3, 4, 5]
# インデックス2の要素を削除
del my_list[2]
#結果を出力
print(my_list)
#結果は [1, 2, 4, 5]になります。
deiメソッドで、スライス指定をして削除します。
my_list = [10, 20, 30, 40, 50]
# インデックス1から2までの要素を削除
del my_list[1:3]
#結果を出力
print(my_list)
#結果は [10, 40, 50]になります。
clearメソッドで、要素をすべて削除します。
my_list = [1, 2, 3, 4, 5]
# リストの要素をすべて削除
my_list.clear()
#結果を出力
print(my_list)
#結果は []になります。
条件を満たす要素を削除:リスト内包表記を使って特定の条件を満たす要素を削除できます。
リスト内包表記については以下を参照してください。
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 偶数の要素だけを残す
numbers = [x for x in numbers if x % 2 == 0]
#結果を出力
print(numbers)
#結果は [2, 4, 6, 8]になります。
リストの長さ
Pythonのリスト(配列)で要素の長さを求めるには、「len()」関数を使用します。この関数はリスト内の要素の数を返します。例えば、以下のコードでリスト [my_list]の長さ(要素数)を求めることができます。
my_list = [10, 20, 30, 40, 50]
#長さを求める
length = len(my_list)
#出力
print(“リストの長さ:”, length)
#結果は リストの長さ 5 になります。
要素の存在確認
Pythonのリスト(配列)で要素の存在を確認するためにはいろいろな方法があります。以下に方法を紹介します。
「in」演算子:指定した要素がリスト内に存在するかどうかを確認します。例えば、以下のコードでリスト [fruits]内に 文字の”coconut”が含まれているかを確認できます。
fruits = [“apple”, “green apple”, “strawberry”, “avocado”, “orange”, “raspberry”]
#”coconut”が配列に含まれるかを出力
print(“coconut” in fruits)
#結果は Falseになります。
「count()」 メソッド:指定した要素がリスト内にいくつ存在するかを数えます。
my_list = [10, 20, 30, 20, 40, 20]
#20が配列にいくつあるか
count_of_20 = my_list.count(20)
#出力
print(“20の個数:”, count_of_20)
#結果は 20の個数 3 になります。
「index()」メソッド:指定した要素の最初のインデックスを取得します。
my_list = [“apple”, “banana”, “orange”, “banana”]
#最初のインデックスを調べる
banana_index = my_list.index(“banana”)
#出力
print(“最初の\”banana\”のインデックス:”, banana_index)
#結果は 1
リストのソート
Pythonのリスト(配列)をソートするためには、いろいろな方法があります。以下にそれぞれの方法とコード例を示します。
昇順のソート
「sort()」メソッドを使って、リストの要素を昇順にソートできます。
例えば、次のコードでリスト 【my_list】を昇順にソートします。
my_list = [5, 2, 3, 4, 1]
#ソートします。
my_list.sort()
#出力
print(“ソート後:”, my_list)
#結果は ソート後 [1, 2, 3, 4, 5] になります。
降順のソート
「sort(reverse=True)」を使って、リストを降順にソートできます。
以下のコードでリスト `my_list` を降順にソートします。
my_list = [5, 2, 3, 4, 1]
#ソートする
my_list.sort(reverse=True)
#出力
print(“ソート後:”, my_list)
#結果は ソート後 [5, 4, 3, 2, 1] になります。
sorted() 関数
「sorted()」関数は新しいリストを返すため、元のリストは変更されません。
例えば、次のコードでリスト `numbers` を昇順にソートします。
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]
#ソートする
sorted_numbers = sorted(numbers)
#出力
print(“ソート後:”, sorted_numbers)
# 結果は ソート後 [1, 1, 2, 3, 4, 5, 5, 6, 9] になります。
リストのコピー
Pythonでは、リストをコピーするために 『浅いコピー』と『深いコピー』の2つの方法があります。以下にそれぞれの方法とコード例を示します。
浅いコピー
『浅いコピー』は、リストの外側のレベルだけを新しいオブジェクトとしてコピーし、内側のオブジェクトは参照としてコピーします。
外側のレベルを変更すると、浅いコピーされたオブジェクトだけが影響を受けます。
以下は浅いコピーの作成方法です。
original_list = [1, [2, 3], 4]
#浅いコピー
copied_list = original_list.copy()
# または copied_list = original_list[:]
[original_list」 は [1, [2, 3], 4]であり、「copied_list」は 「original_list」の浅いコピーです。浅いコピーは外側のレベルだけを新しいオブジェクトとしてコピーし、内側のオブジェクトは参照としてコピーします。
つまり、「copied_list」の内部リスト [2, 3]は 「original_list」の内部リストと同じオブジェクトを参照しています。
したがって、「copied_list」を変更すると、「original_list」 も影響を受けます。例えば、次のようにして内部リストの要素を変更すると、両方のリストが変更されます。
copied_list[1][0] = 99
#出力
print(original_list)
#結果は [1, [99, 3], 4]
#出力
print(copied_list)
#結果は [1, [99, 3], 4]
このように、浅いコピーは外側のレベルのみをコピーするため、内部のミュータブルなオブジェクトは共有されます。
深いコピー
『深いコピー』は、元のオブジェクトの完全な複製を作成します。ネストしたすべてのオブジェクトもコピーされます。
元のリストは影響を受けません。
以下は深いコピーの作成方法です。
#配列の定義
original_list = [1, [2, 3], 4]
#深いコピー
copied_list = copy.deepcopy(original_list)
[original_list」 は [1, [2, 3], 4]であり、「copied_list」は 「original_list」の浅いコピーです。浅いコピーは外側のレベルだけを新しいオブジェクトとしてコピーし、内側のオブジェクトは参照としてコピーします。
Pyhonの多次元配列とその操作
多次元配列というのは、配列(リスト)がさらに、配列(リスト)になっているものことを表します。言葉で説明するとわかりにくいかもしれませんが、1次元配列は[1,2,3]ですが、2次元配列(2次元リスト)は[[1,2,3],[4,5,6]]となり、3次元配列はさらに[[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]となります。
理論的には何次元でも作ることは、パソコンのメモリが許す限りは可能です。多次配列は、複雑な数値計算が必要な、画像処理、ゲーム、機械学習などで使われます。
二次元配列の作り方と初期化
基本的な作り方は以下のようになります。
以上の例は3列×3行の二次元配列を作ります。
上記の二次元配列は、リスト内包表記を使っても以下のように作成できます。
※range()は、Pythonの関数で連番を作ります。rangeについては以下を参照ください。
Python公式サイト range関数
ライブラリのnumpyを使う方法もあります。
matr = np1.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
こちらも、上記の二次元配列と同じものをつくります。
※厳密にはnumpyライブラリで作くられる配列は取り扱い方がちがいます。
多次元配列を扱う場合や、配列に対する数値計算(科学技術演算)や行列演算を行う場合はnumpyライブラリの配列を使う方がよいです。
numpyについて詳しくは以下を参照してください。
numpy公式サイト
ライブラリのnumpyを使うと1次元配列を、2次元配列に変換できます。reshape関数を使います。
#1次元配列を定義する
arra = np.array([1, 2, 3, 4, 5, 6])
#2行×3列の2次元配列へ変換する。
matr = arra.reshape((2, 3))
#結果を出力する
print(matr)
# 出力結果は[[1, 2, 3]
# [4, 5, 6]]になる
要素が空の二次元配列は以下のように作成します。
empty_matrix = [[None] * 3 for _ in range(3)]#または空のリストを使う
empty_matrix = [[] for _ in range(3)]
多次元配列での要素の操作
基本的にはインデックスを使って、要素にアクセスします。
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
#出力
print(“1行1列の要素:”, matrix[0][0])
# 出力結果: 1
#出力
print(“2行3列の要素:”, matrix[1][2])
# 出力結果: 6
#出力
print(“3行2列の要素:”, matrix[2][1])
# 出力結果: 8
すべての要素にアクセスするにはFor文を使います。
for item in row:
print(item)
#出力結果
1
2
3
4
5
6
7
8
9
2次元配列への要素の追加
matrix[0].append(100)
# 出力:
print(matrix)
#結果 [[1, 2, 3, 100], [4, 5, 6], [7, 8, 9]]
#リストを追加する
matrix.append([10, 11, 12])
# 出力:
print(matrix)
# 結果 [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
2次元配列への要素の削除
# 2次元配列の2行2列目の要素を削除
del two_dimensional_array[1][1]
# 出力:
print(two_dimensional_array)
#結果 [[1, 2, 3], [4, 6], [7, 8, 9], [10, 11, 12]]
3次元配列へのインデックスを使った要素へのアクセス
# 3x3x3の3次元配列を作成
three_dimensional_array = np.array([[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
[[10, 11, 12], [13, 14, 15], [16, 17, 18]],
[[19, 20, 21], [22, 23, 24], [25, 26, 27]]])
# 要素にアクセスするためのインデックスを指定
# 出力:
print(“1行1列1深さの要素:”, three_dimensional_array[0][0][0])
# 結果 1
# 出力:
print(“2行3列2深さの要素:”, three_dimensional_array[1][2][1])
# 結果 17
# 出力:
print(“3行2列3深さの要素:”, three_dimensional_array[2][1][2])
# 結果 24
Python配列を使った計算
Pythonの配列を使った計算は、内包表記での計算やnumpyライブラリを使用すると簡単にプログラミングすることができます。
以下に詳しく説明します。
配列の要素の足し算と掛け算
内包表記での計算やnumpyライブラリを使わない その1
list2 = [4, 5, 6]
result = []
for i in range(len(list1)):
result.append(list1[i] + list2[i])
#掛け算の場合は*にする
# result.append(list1[i] * list2[i])
# 出力:
print(result)
# 結果は [5, 7, 9]
list1 = [1, 2, 3]
list2 = [4, 5, 6]
#mapで使う関数を定義する。
def add(x, y):
return x + y
#map関数を使って計算する。
result = list(map(add, list1, list2))
# 出力:
print(result)
#結果[5, 7, 9]
ちなみに掛け算の場合は該当する箇所を以下のように書き換えます。
def multi(x, y):
return x * y
#map関数を使って計算する。
result = list(map(multi, list1, list2))
NumPyの配列を使う例 その1
array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])
# 配列の要素ごとに足し算を行う
sum_array = array1 + array2
#掛け算の場合は*にする
#sum_array = array1 * array2
#出力:
print(sum_array)
#結果は[5 7 9]
NumPyの配列を使う例 その2
# 2 つの配列を作成
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])# 要素同士を足し合わせる
result = np.add(arr1, arr2)
# 掛け算の場合
# result = np.multiply(arr1, arr2)
# 出力
print(result)
# 結果 [5 7 9]
NumPyの配列を使った方が、コードがすっきりしますし、計算が早いです。
リスト内包表記での計算
リスト内包表記を使った足し算
list2 = [4, 5, 6]
#リスト内包表記を使った計算
result = [x + y for x, y in zip(list1, list2)]
# 出力:
print(result)
#結果 [5, 7, 9]
リスト内包表記を使った掛け算
list2 = [4, 5, 6]
#リスト内包表記を使った計算
result = [x * y for x, y in zip(list1, list2)]
# 出力:
print(result)
#結果 [4, 10, 18]
リスト内包表記を使った方がすっきりとしたコードが書けます。
Pyhon配列が使える場面・活用事例
Pythonの配列(リスト)は、複数のデータを格納し、操作するために利用されます。例えば、データの集計、ループ処理、要素の追加・削除、ソートなどがあります。
下記では活用事例について詳しく説明します。
データ分析
Python の配列(リストや NumPy 配列)は、データ分析に幅広く活用されています。具体的な活用事例として、データクリーニング、集計、データ可視化、機械学習モデルの入力データ作成、時系列データの処理などがあります。
機械学習
Python の配列(リストや NumPy 配列)は、機械学習に幅広く活用されています。具体的な活用事例として、特徴量行列の作成、画像処理、テキスト分析、時系列データの予測などがあります。これらの例は、Python の配列が機械学習において重要であることを示しています。
Webスクレイピング
Webスクレイピングは、ウェブページから情報を抽出するプロセスを実行します。以下のステップで行います。
- 1. ウェブページにアクセスし、HTMLデータを取得
- 2. HTMLデータから情報を抽出
- 3. 抽出されたデータを保存
Pythonの配列(リスト)は、これらのステップでさまざまな方法で活用されます。URLリストの管理、抽出したデータの一時的な保存、複数の要素の同時処理、データの整形やフィルタリングなどに使用できます。
ゲーム開発
ゲーム開発においてPythonの配列はさまざまな方法で活用されています。以下にいくつかの事例を紹介します。
ゲームオブジェク トの管理
ゲーム内のキャラクターやアイテムなどのオブジェクトをリストで管理します。例えば、敵の位置やプレイヤーの所持アイテムなどを配列で保持します。
パズルゲームの盤面操作
スライドパズルなどの盤面パズルゲームでは、配列を使ってタイルの移動や配置を管理します。
ランダムな配置の生成
マップや敵の配置など、ランダムな要素を生成する際に配列を活用します。
Pythonの配列は、ゲーム開発において効率的で柔軟なデータ管理に役立ちます。
まとめ:Python配列をマスターしましょう
配列はプログラム言語の基本の仕組みで、連続した記憶域を作成し、インディックスを使ってアクセスをおこないます。Pythonでは配列の定義が簡単にでき、配列用のライブラリnumpyも存在しており、高度な多次元配列を扱うこともできます。
配列を扱うことで多くの数学的な計算を行うことができます。それにより、データ分析・機械学習・ゲーム開発などの分野で応用することができます。
この記事ではPythonの配列(リスト)について、コード例も紹介して、詳しく説明しています。
Jiteraでは、要件定義を書くだけでAIが開発支援をしてくれるツールで、アプリ・システム開発を行っています。制作している途中で要件が変更になっても柔軟に修正しながら開発できるので、アプリ開発・システム開発のご相談、またPythonの配列(リスト)についてわからないことや、簡単な疑問があれば、ぜひ、お問い合わせください。