1. はじめに
Python は、シンプルで直感的な構文を持つプログラミング言語として、多くの分野で利用されています。その中でも、「配列」はデータの管理や操作において重要な役割を果たします。
しかし、Python には C言語のような「配列型」 は存在せず、代わりに リスト(List)・タプル(Tuple)・NumPy 配列(ndarray) などのデータ構造が使われます。それぞれのデータ構造には 特性や用途が異なる ため、適切に選択することが重要です。
Python の配列とは?
- リスト(List):可変(変更可能)で柔軟性の高いデータ構造
- タプル(Tuple):不変(変更不可)で処理速度が速い
- NumPy 配列(ndarray):数値計算・データ分析に特化した配列型
この記事では、Python の配列の基礎から応用までを完全ガイド します。初心者の方にも分かりやすいように、具体的なコード例を交えながら 解説していきます。
2. Python の配列とは?(リスト・タプル・NumPy)
Python では、「配列(Array)」というデータ型は 標準では提供されていません。そのため、一般的には リスト(List) を使って配列のようにデータを扱います。
また、変更不可なデータを扱う場合には タプル(Tuple)、数値演算を効率的に行う場合には NumPy の ndarray を使用します。
Python の配列として利用されるデータ構造
データ構造 | 特徴 | 使うべき場面 |
---|---|---|
リスト(List) | 可変(変更可能) で柔軟にデータを扱える | 一般的な配列操作 |
タプル(Tuple) | 不変(変更不可) で高速処理が可能 | 定数データの管理 |
NumPy 配列(ndarray) | 大規模な数値計算・データ分析に最適 | 科学計算や機械学習 |
リスト・タプル・NumPy 配列の基本的な使い方
Python では、以下のように リスト、タプル、NumPy 配列 を作成できます。
import numpy as np
# リストの作成
my_list = [1, 2, 3, 4, 5]
# タプルの作成
my_tuple = (1, 2, 3, 4, 5)
# NumPy 配列の作成
my_array = np.array([1, 2, 3, 4, 5])
print(my_list) # [1, 2, 3, 4, 5]
print(my_tuple) # (1, 2, 3, 4, 5)
print(my_array) # [1 2 3 4 5]
リスト・タプル・NumPy 配列の違い
項目 | リスト(List) | タプル(Tuple) | NumPy 配列(ndarray) |
---|---|---|---|
変更可能性 | ✅ 変更可能 | ❌ 変更不可 | ✅ 変更可能 |
速度 | 普通 | 速い | 非常に速い |
メモリ使用量 | 多め | 少なめ | 最適化されている |
用途 | 一般的なデータ操作 | 変更しないデータ管理 | 科学計算・機械学習 |
3. Python のリスト(List)を理解する
Python のリスト(List)は、可変長(変更可能)な配列 のようなデータ構造です。リストを使用すると、数値や文字列などの異なるデータ型を一つのデータ構造にまとめて格納できます。リストは Python における 最も基本的でよく使われるデータ構造 の一つです。
リストの基本
リストの作成方法
Python では、リストを 角括弧 []
を使用して作成 します。
# 空のリストを作成
empty_list = []
# 数値を含むリスト
numbers = [1, 2, 3, 4, 5]
# 文字列を含むリスト
fruits = ["apple", "banana", "cherry"]
# 異なるデータ型を混在させることも可能
mixed_list = [1, "hello", 3.14, True]
print(numbers) # [1, 2, 3, 4, 5]
print(fruits) # ['apple', 'banana', 'cherry']
print(mixed_list) # [1, 'hello', 3.14, True]
リストの要素にアクセス
リストの各要素には、インデックス(添字)を使ってアクセス できます。Python のインデックスは 0から開始 し、負のインデックスを使うことで後ろからアクセスすることも可能です。
fruits = ["apple", "banana", "cherry"]
# インデックスを指定して要素を取得
print(fruits[0]) # apple
print(fruits[1]) # banana
# 負のインデックスを使用(後ろからアクセス)
print(fruits[-1]) # cherry
print(fruits[-2]) # banana
リストのスライス(部分取得)
スライス(Slice)を使うことで、リストの一部分を取得できます。
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 最初の5個の要素を取得
print(numbers[:5]) # [0, 1, 2, 3, 4]
# 3番目から7番目までの要素を取得
print(numbers[2:7]) # [2, 3, 4, 5, 6]
# 最後の3つの要素を取得
print(numbers[-3:]) # [7, 8, 9]
# 2つ飛ばしで要素を取得
print(numbers[::2]) # [0, 2, 4, 6, 8]
リストの要素の変更
リストは ミュータブル(変更可能) なので、要素を変更することができます。
fruits = ["apple", "banana", "cherry"]
# 2番目の要素を変更
fruits[1] = "orange"
print(fruits) # ['apple', 'orange', 'cherry']
リストの追加・削除
要素を追加する
Python のリストでは、append()
や insert()
を使って要素を追加できます。
fruits = ["apple", "banana"]
# リストの末尾に要素を追加
fruits.append("cherry")
print(fruits) # ['apple', 'banana', 'cherry']
# 指定した位置に要素を追加
fruits.insert(1, "orange")
print(fruits) # ['apple', 'orange', 'banana', 'cherry']
要素を削除する
リストから要素を削除するには、remove()
や pop()
を使用します。
fruits = ["apple", "banana", "cherry"]
# 指定した値の要素を削除
fruits.remove("banana")
print(fruits) # ['apple', 'cherry']
# 指定したインデックスの要素を削除
fruits.pop(1)
print(fruits) # ['apple']
リストの結合と複製
リストの結合
+
演算子を使ってリストを結合できます。
list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined_list = list1 + list2
print(combined_list) # [1, 2, 3, 4, 5, 6]
リストの複製
リストを複製する場合、スライス [:]
を使うのが安全です。
original_list = [1, 2, 3]
copied_list = original_list[:]
print(copied_list) # [1, 2, 3]
まとめ
- リストは可変長のデータ構造であり、要素の追加・削除・変更が可能
- インデックスやスライスを使って要素にアクセス
- リストの操作(追加・削除・結合・ソートなど)を効率的に行う方法を学んだ
4. Python のタプル(Tuple)を理解する
Python の タプル(Tuple) は、リストと同じように 複数の値を格納できるデータ構造 ですが、 不変(immutable) という特徴を持っています。
つまり、一度作成したタプルの要素は 変更・追加・削除ができません。
この特性により、タプルは データの不変性を保証する 必要がある場面で活用されます。また、リストよりも メモリ効率が良く、処理速度が速い というメリットもあります。
タプルの基本
タプルの作成方法
タプルは 丸括弧 ()
を使用 して作成します。
# タプルの作成
fruits = ("apple", "banana", "cherry")
numbers = (1, 2, 3, 4, 5)
print(fruits) # ('apple', 'banana', 'cherry')
print(numbers) # (1, 2, 3, 4, 5)
1要素のタプルを作成する方法
タプルを作成する際、要素が 1つだけの場合 は注意が必要です。
カンマ ,
を付けないと、単なる数値や文字列として扱われてしまいます。
single_value = (42) # タプルではなく、整数
correct_tuple = (42,) # これはタプル
print(type(single_value)) # <class 'int'>
print(type(correct_tuple)) # <class 'tuple'>
タプルの要素にアクセス
タプルの各要素には、インデックス(添字)を使ってアクセス できます。リストと同様に、Python のインデックスは 0から開始 します。
colors = ("red", "green", "blue")
# インデックスを指定してアクセス
print(colors[0]) # red
print(colors[1]) # green
# 負のインデックスを使用
print(colors[-1]) # blue
print(colors[-2]) # green
タプルのスライス(部分取得)
タプルもリストと同じように スライス(部分取得) を行うことができます。
numbers = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
# 先頭5つの要素を取得
print(numbers[:5]) # (0, 1, 2, 3, 4)
タプルとリストの変換
タプルとリストは、tuple()
や list()
を使うことで相互に変換できます。
# リスト → タプル
numbers_list = [1, 2, 3]
numbers_tuple = tuple(numbers_list)
print(numbers_tuple) # (1, 2, 3)
# タプル → リスト
fruits_tuple = ("apple", "banana", "cherry")
fruits_list = list(fruits_tuple)
print(fruits_list) # ['apple', 'banana', 'cherry']
まとめ
- タプルは不変(immutable)であり、作成後に変更できない
- リストよりもメモリ効率が良く、処理速度が速い
- データの不変性を保証する場面(定数・辞書のキー・関数の戻り値など)で活用
- リストとの相互変換が可能だが、変更する可能性がある場合はリストを使うべき
5. 【比較表】リスト vs タプル – どちらを使うべき?
Python では、リスト(List) と タプル(Tuple) の両方が配列のように使えます。しかし、これらには重要な違いがあり、適切に使い分けることが重要 です。
リストとタプルの違い
まず、リストとタプルの 主な違い を比較表で整理します。
項目 | リスト(List) | タプル(Tuple) |
---|---|---|
変更可能性 | ✅ 変更可能(追加・削除・更新) | ❌ 変更不可(不変) |
速度 | 遅め | 速い |
メモリ使用量 | 多め | 少なめ |
要素の追加・削除 | 可能 | 不可能 |
辞書のキーとして使用 | ❌ 不可 | ✅ 可能 |
用途 | 可変データ管理 | 不変データ管理 |
リストとタプルの使い分け
✅ リストを使うべきケース
- データの変更が必要な場合
users = ["Alice", "Bob", "Charlie"]
users.append("David") # 新しいユーザーを追加
print(users) # ['Alice', 'Bob', 'Charlie', 'David']
- 可変長のデータを扱う場合
user_input = []
while True:
data = input("データを入力(終了: exit):")
if data == "exit":
break
user_input.append(data)
print(user_input)
✅ タプルを使うべきケース
- 変更してはいけないデータ
weekdays = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
- 辞書のキーとして使用する場合
location_data = {
(35.6895, 139.6917): "Tokyo",
(40.7128, -74.0060): "New York"
}
print(location_data[(35.6895, 139.6917)]) # Tokyo
まとめ
- リストは可変で、データの追加・削除・変更が可能なデータ構造。
- タプルは不変で、変更する必要のないデータや辞書のキーとして利用される。
- 動的なデータを扱う場合は、リストの方が適している。
6. 配列操作の応用
Python のリスト(List)やタプル(Tuple)を使いこなすことで、より高度なデータ処理が可能になります。このセクションでは、配列操作の応用テクニック を紹介し、実用的なプログラムに活用できるようにします。
リスト内包表記(リストを効率的に生成)
# 通常のリスト生成
squares = []
for x in range(10):
squares.append(x**2)
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# リスト内包表記
squares = [x**2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
多次元リストの扱い
# 3x3 の行列を作成
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print(matrix[0]) # [1, 2, 3]
print(matrix[1][2]) # 6
リストと辞書の相互変換
# 2つのリストを辞書に変換
keys = ["name", "age", "city"]
values = ["Alice", 25, "Tokyo"]
person_dict = dict(zip(keys, values))
print(person_dict) # {'name': 'Alice', 'age': 25, 'city': 'Tokyo'}
リストのソートとランダム操作
import random
numbers = [1, 2, 3, 4, 5]
random.shuffle(numbers)
print(numbers) # 例: [3, 1, 5, 2, 4]
random_choice = random.choice(numbers)
print(random_choice) # 例: 2
まとめ
- リスト内包表記を活用して、効率的にリストを作成できる。
- 多次元リストを使って行列や表のデータを扱える。
- リストと辞書を相互変換することで、データを柔軟に管理できる。
- リストの並べ替えやランダム処理を活用することで、応用的なデータ処理が可能。
7. よくある質問(FAQ)
Python のリストやタプルは非常に便利なデータ構造ですが、使い方について疑問に思う点も多い かもしれません。
このセクションでは、Python のリスト・タプルに関するよくある質問 を Q&A 形式で解説します。
Q1: リストとタプルの違いは何ですか?
A: リストは可変(変更可能)、タプルは不変(変更不可) という点が最大の違いです。
# リスト(変更可能)
my_list = [1, 2, 3]
my_list[0] = 100 # 変更可能
print(my_list) # [100, 2, 3]
# タプル(変更不可)
my_tuple = (1, 2, 3)
my_tuple[0] = 100 # TypeError: 'tuple' object does not support item assignment
Q2: リストをコピーする正しい方法は?
A: copy()
またはスライス [:]
を使うのが安全です。
# スライスを使う
list_a = [1, 2, 3]
list_b = list_a[:]
list_b[0] = 100
print(list_a) # [1, 2, 3] ← 元のリストは変わらない!
Q3: リスト内包表記とは何ですか?
# 通常のリスト生成
squares = []
for x in range(10):
squares.append(x**2)
# ✅ リスト内包表記を使うと簡潔に書ける
squares = [x**2 for x in range(10)]
Q4: Python でリストを JSON 形式に変換するには?
import json
data = [1, 2, 3, 4, 5]
json_data = json.dumps(data)
print(json_data) # "[1, 2, 3, 4, 5]"
Q5: リストの要素をランダムに並び替えるには?
import random
numbers = [1, 2, 3, 4, 5]
random.shuffle(numbers)
print(numbers) # 例: [3, 1, 5, 2, 4]
Q6: NumPy 配列とリストの違いは?
項目 | リスト(List) | NumPy 配列(ndarray) |
---|---|---|
データ型 | 任意 | 同じ型のデータのみ |
処理速度 | 遅い | 速い(C言語ベースで最適化) |
メモリ使用量 | 多い | 少ない |
数学演算 | for ループが必要 | ベクトル演算が可能(高速) |
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(arr * 2) # [2 4 6 8 10]
まとめ
この FAQ セクションでは、Python のリストやタプルに関する よくある疑問とその解決方法 を解説しました。
- リストとタプルの違い → 変更可能性が異なる
- リストのコピー →
copy()
やスライス[:]
を使う - リスト内包表記 →
for
ループより簡潔に書ける - リストの JSON 変換 →
json.dumps()
/json.loads()
を活用 - NumPy 配列とリストの違い → NumPy は高速で数値演算向き
8. まとめ
この記事では、Python における 配列(リスト・タプル・NumPy 配列) の基礎から応用までを詳しく解説しました。
この記事で学んだこと
✅ Python の配列とは?
- Python には C言語のような「配列型」は存在しない
- 代わりに「リスト(List)」「タプル(Tuple)」「NumPy 配列(ndarray)」が使われる
✅ Python のリスト
- 可変長(変更可能)なデータ構造
- 要素の追加・削除・変更が可能
✅ Python のタプル
- 不変(変更不可)なデータ構造
- 辞書のキーとして使用可能
- 処理速度が速く、メモリ使用量が少ない
✅ リスト vs タプルの比較
項目 | リスト(List) | タプル(Tuple) |
---|---|---|
変更可能性 | ✅ 変更可能 | ❌ 変更不可 |
速度 | 遅め | 速い |
メモリ使用量 | 多め | 少なめ |
用途 | 可変データ管理 | 不変データ管理 |
さらに学ぶための参考リンク
📘 Python公式ドキュメント
最後に
Python の配列(リスト・タプル・NumPy)を理解し、適切に活用できるようになると、データの管理や処理がより簡単で効率的になります。
ぜひ 実際にコードを書いて試してみてください!