リストとタプルの基本概念
Pythonのリストとタプルは、どちらも任意のデータ型を格納できる順序付きコレクションです。多くのプログラミング言語ではコレクション内のデータ型が統一されている必要がありますが、Pythonではこの制約はありません。
主な違い
リストは動的で、長さを変更したり、要素を追加・削除・変更したりできます(mutable)。
一方、タプルは静的で、長さと要素を変更することはできません(immutable)。
既存のタプルを「変更」したい場合は、新しいタプルを新しくメモリ上に作成する必要があります。
共通の機能
Pythonのリストとタプルは、負のインデックスをサポートしています。
また、スライス操作もサポートしています。
どちらもネスト(入れ子)が可能です。
list()とtuple()関数を使って相互に変換できます。
data_tuple = (10, 20, 30)
converted_list = list(data_tuple)
print(converted_list) # [10, 20, 30]
data_list = [40, 50, 60]
converted_tuple = tuple(data_list)
print(converted_tuple) # (40, 50, 60)
よく使われる組み込み関数
count(item):リスト/タプル内でitemが出現する回数を返します。
index(item):リスト/タプル内でitemが最初に出現するインデックスを返します。
reverse()とsort():リストを逆順に並べ替えたり、ソートしたりします(タプルにはこれらのメソッドはありません)。
reversed()とsorted():リスト/タプルを逆順に並べ替えたり、ソートしたりします。reversed()は逆順のイテレータを返し、sorted()は新しいリストを返します。
sample_list = [3, 1, 4, 1, 5, 9, 2, 6]
print(sample_list.count(1)) # 2
print(sample_list.index(4)) # 2
sample_list.sort()
print(sample_list) # [1, 1, 2, 3, 4, 5, 6, 9]
reversed_list = list(reversed(sample_list))
print(reversed_list) # [9, 6, 5, 4, 3, 2, 1, 1]
ストレージ方式の違い
リストとタプルは同じ要素を格納しても、メモリ使用量が異なります。タプルの方がリストより少ないメモリを使用します。
dynamic_list = [100, 200, 300]
print(dynamic_list.__sizeof__()) # 72
static_tuple = (100, 200, 300)
print(static_tuple.__sizeof__()) # 56
これは、リストが動的な性質を持つため、要素へのポインタ(8バイト)とリストの長さを追跡するための追加領域(8バイト)を必要とするからです。タプルは静的であるため、このようなオーバーヘッドがありません。
パフォーマンス
タプルはリストより軽量であるため、一般的にパフォーマンスはタプルの方が若干優れています。
使用シナリオ
データと数量が不変の場合(例:関数が返す緯度経度データなど)はタプルが適しています。
データや数量が可変の場合(例:ソーシャルプラットフォームのログ機能など)はリストが適しています。