出典:

 

タプルとリストはとてもよく似ています。

どちらも他のデータを格納できるコンテナオブジェクトで、格納した要素は数値をインデックスとして参照できます。リストにはデータを追加したり削除したりできますが、タプルは変更できません。タプルとリストの見た目もよく似ています。

list_values = [1, 2, 3]  # リスト
tuple_values = (1, 2, 3) # タプル

リストとタプルはどのように使い分ければよいのでしょうか?

前述のように、タプルは

複数のデータの組み合わせから構成されているデータ

のためのオブジェクトです。

次の例は、学校である生徒の定期テストの結果をデータとして記述しています。

sugaku = 50  # 数学の点数
kokugo = 60  # 国語の点数
eigo = 70  # 英語の点数

exam_scores = (sugaku, kokugo, eigo)

exam_scores は、ある生徒の成績を

(数学の点数, 国語の点数, 英語の点数)

という決まったルールで記述した、固定的な形式のデータです。

このように、複数の要素から構成される独立したデータ をあらわすときは、タプルを使用します。

もう一つの例として、たくさんの生徒のテストの点数を、教科ごとにまとめたデータを考えてみましょう。

sugaku_scores = [82, 12, 12, 94, 86, 5]
kokugo_scores = [99, 64, 99, 39, 56, 1, 77, 57, 82, 75, 5, 74, 3]
eigo_scores = [16, 81, 82, 47, 80, 48, 10, 72, 81, 7]

ここで定義した変数 sugaku_scoreskokugo_scoreseigo_scores は、それぞれ数学、国語、英語の、全受験者の点数をまとめたリストです。それぞれの教科では受験者数が違うため、要素数も全て異なっています。

このように、固定的な形式をもつ独立したデータではなく、不定個数の独立したデータをたくさん集約してまとめておきたい、という用途には、リストが適しています。

もちろん、タプルを使わず、常にリストを使用することもできますが、その場合次のようなデメリットが考えられます。

  • exam_scores のようにタプルで作られたデータは、あとからプログラムを参照する人に 「これは複数の値から構成されるデータだ」 という情報を伝え、プログラムの意図を理解する助けになります。リストにしてしまうと、間違った意図を伝えることになります。

  • タプルは個別のデータをあらわすオブジェクトなので、非常にたくさんのオブジェクトが使用されても効率的に処理できるようになっています。

    テストの例で考えると、受験者が100万人いた場合は exam_scores のようなデータが100万個作られることになります。タプルの場合には100万件のデータを作っても最小限の負荷で抑えられますが、リストで同じデータを100万個作ると、タプルと比べて大きな負荷がかかります。

 

list()でリストを生成

list()の引数にタプルなどのイテラブルオブジェクトを指定すると、その要素を持つリストが生成される。

 

tuple()でタプルを生成

tuple()の引数にリストなどのイテラブルオブジェクトを指定すると、その要素を持つタプルが生成される。