Pythonのデータ構造:リストとタプル

リストとタプルの基本概念

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バイト)を必要とするからです。タプルは静的であるため、このようなオーバーヘッドがありません。

パフォーマンス

タプルはリストより軽量であるため、一般的にパフォーマンスはタプルの方が若干優れています。

使用シナリオ

データと数量が不変の場合(例:関数が返す緯度経度データなど)はタプルが適しています。

データや数量が可変の場合(例:ソーシャルプラットフォームのログ機能など)はリストが適しています。

タグ: Python リスト タプル データ構造 mutable

5月21日 03:57 投稿