このガイドでは、Python の タプル と リスト の 類似点 と 相違点 を学びます。また、いつタプルを使用すべきかについても理解できます。
リストとタプルはどちらも Python の組み込みデータ構造です。要素のコレクションを保存するために使用できます。
インデックス作成とスライスのサポートから異種データ型の包含に至るまで、タプルとリストは同様の機能を備えているように見えるかもしれません。したがって、この 2 つの類似点と相違点を理解すると、どちらのデータ構造を使用するかを決定するのに役立ちます。
さぁ、始めよう。
👩🏽💻 Python REPL を開始して、このチュートリアルに従うことができます。 のオンライン Python エディターを使用してコーディングすることもできます。
Python タプルとリスト: 類似点は何ですか?
リストとタプルの類似点を学ぶことから始めましょう。より良い学習を促進するために、リストとタプルの両方の例を示します。

#1 。 Python イテラブル
Python では、リストは角括弧のペアで囲まれますが、タプルは括弧で囲まれます。かっこを使用せずに、カンマで区切られた値のセットとしてタプルを作成することもできます。
どちらも反復可能です。したがって、
for
ループを使用してそれらをループできます。
以下のコードセルは、リストを反復処理する方法を示しています。
nums = [2,6,7,10]
print(f"Type of nums is {type(nums)}")
for num in nums:
print(num)
# Output
Type of nums is <class 'list'>
2
6
7
10
以下で説明するように、ループを使用してタプルを反復処理することもできます。
nums = (2,6,7,10)
# Note: nums = 2,6,7,10 is a valid tuple as well. If needed, run a quick check!
print(f"Type of nums is {type(nums)}")
for num in nums:
print(num)
# Output
Type of nums is <class 'tuple'>
2
6
7
10
#2 。他のシーケンスからの作成のサポート
リストとタプルの次の類似点は、文字列などの既存のシーケンスから作成できることです。
sample_str = "Coding!"
次のコード セルは、
list(string)
リスト項目を文字列内の文字として返すリストを返す方法を示しています。
list_from_str = list(sample_str)
print(list_from_str)
# Output
['C', 'o', 'd', 'i', 'n', 'g', '!']
同様に、
tuple(sequence)
を使用して文字列または他のシーケンスからタプルを作成できます。以下のコードセルは、その方法を示しています。
tuple_from_str = tuple(sample_str)
print(tuple_from_str)
# Output
('C', 'o', 'd', 'i', 'n', 'g', '!')
#3 。インデックス作成とスライスのサポート
Python は、最初の要素のインデックス 0、2 番目の要素のインデックス 1 などのゼロ インデックス付けをサポートしています。 Python は負のインデックス付けもサポートしています。つまり、最後の要素はインデックス -1、最後から 2 番目の要素はインデックス -2 などになります。
list_from_str = ['C', 'o', 'd', 'i', 'n', 'g', '!']
print(list_from_str[1])
# o
インデックス -2 の項目は、最後から 2 番目の項目「g」です。
tuple_from_str = ('C', 'o', 'd', 'i', 'n', 'g', '!')
print(tuple_from_str[-2])
# g
リストまたはタプルの小さなセクションを操作する場合は、スライスを使用できます。 list[start:end] は、インデックス start から始まり end – 1 までのリストのスライスを返します。start のデフォルト値は 0 で、end は反復可能な要素の最後の要素です。
同じ構文を使用してタプルをスライスできます。先ほど作成したリストとタプルのスライスを作成しましょう。
list_from_str = ['C', 'o', 'd', 'i', 'n', 'g', '!']
print(list_from_str[0:5])
['C', 'o', 'd', 'i', 'n']
開始値と終了値に加えて、ステップ値も指定できます。
tuple(start:end:step)
start
から
end - 1
までのタプルのスライスを
step
のステップで返します。
tuple_from_str = ('C', 'o', 'd', 'i', 'n', 'g', '!')
print(tuple_from_str[::2])
('C', 'd', 'n', '!')
ここでは、ステップ値を 2 に設定します。つまり、スライスには 2 つおきの要素が含まれます。
#4 。複数のデータ型のコレクション
これまで検討した例では、リストとタプルのすべての項目が同じデータ型でした。
ただし、単一のリストまたはタプル内にさまざまなデータ型の値を格納できます。
student_list
の下のコード スニペットには、学生の名前が文字列として、年齢が整数として、保護されたマークが浮動小数点として含まれています。
student_list = ["John",22,96.5]
for item in student_list:
print(f"{item} is of type {type(item)}")
# Output
John is of type <class 'str'>
22 is of type <class 'int'>
96.5 is of type <class 'float'>
タプルについても同様の例が考えられます。
student_tuple = ("Jane",23,99.5)
for item in student_tuple:
print(f"{item} is of type {type(item)}")
# Output
Jane is of type <class 'str'>
23 is of type <class 'int'>
99.5 is of type <class 'float'>
#5 。メンバーシップテストのサポート
リストとタプルの両方を使用して、特定の項目の存在についてメンバーシップ テストを実行できます。特定の項目がリストまたはタプルに存在するかどうかを確認する場合は、
in
演算子を使用できます。
item in iterable
iterable
にitem
含まれている場合にTrue
と評価されます。それ以外の場合はFalse
。
"Alex" in student_list
# False
"Jane" in student_tuple
# True
ここまで、Python のリストとタプルの類似点を学習しました。次に、2 つのデータ構造の主な違いを学びましょう。
Python タプルとリスト: 違いは何ですか?
#1 。 Python におけるリストの可変性とタプルの不変性
Python におけるリストとタプルの最も重要な違いは、 タプル が 不変で あることです。これは、タプルをその場で変更 できないこと を意味します。
▶️一例をご紹介します。
tuple1 = ("Java","Python","C++")
tuple1[0] = "Rust"
# Output
----> 2 tuple1[0] = "Rust"
TypeError: 'tuple' object does not support item assignment
リストは変更可能なデータ構造であるため、次のコード セルのように、特定のインデックスにある項目を変更することでリストを変更できます。
list1 = ["Java","Python","C++"]
list1[0] = "Rust"
print(list1)
# Output
['Rust', 'Python', 'C++']
#2 。可変長リストと固定長タプル
Python リストは可変長のデータ構造です。
次のことができます。
- リストの最後に項目を追加します
- 別のリストの項目を現在のリストの末尾に追加します
- 特定のインデックスにある項目をリストから削除します
list1 = [2,3,4,5]
# add an item to the end
list1.append(9)
print(list1)
# add items from list2 to the end of list1
list2 = [0,7]
list1.extend(list2)
print(list1)
# remove an item from list1
list1.pop(0)
print(list1)
▶️ 上記のコード スニペットの出力。
# Output
[2, 3, 4, 5, 9]
[2, 3, 4, 5, 9, 0, 7]
[3, 4, 5, 9, 0, 7]
タプルは固定長のデータ構造です。したがって、既存のタプルに要素を追加したり削除したりすることはできません。ただし、タプルを再定義して別の要素を含めることはできます。
tuple1 = (2,4,6,8)
tuple1 = (1,8,9)
print(tuple1)
# Output
(1, 8, 9)
#3 。メモリ内のサイズ
前のセクションで学んだことを基に構築していきます。 リスト は 可変長の データ構造です。
最初にリストを定義すると、メモリ内に特定のサイズが割り当てられます。現在、
append()
または
extend()
メソッドを使用してリストを変更する場合、追加された要素を格納するために追加のメモリを割り当てる必要があります。この割り当ては、ほとんどの場合、追加する項目の数よりも多く行われます。
したがって、リスト上の項目の数と割り当てられたスペースを追跡する必要があります。さらに、リストは可変長であるため、リスト項目のアドレスを指すポインターがあります。その結果、長さ
k
のリストは、同じ
k
の要素を持つタプルよりも多くのメモリを消費します。
ここに簡単な図を示します。

Python オブジェクトに対して組み込み
sys
モジュールの
getsizeof()
メソッドを使用して、メモリ内のオブジェクトのサイズを取得できます。
import sys
list1 = [4,5,9,14]
list_size = sys.getsizeof(list1)
print(f"Size of list:{list_size}")
tuple1 = (4,5,9,14)
tuple_size = sys.getsizeof(tuple1)
print(f"Size of tuple:{tuple_size}")
以下の出力で確認できるように、リストは同じ数と値の要素のタプルよりも多くのメモリを消費します。
# Output
Size of list:104
Size of tuple:88

Python タプルを使用する必要があるのはどのような場合ですか?
Python のリストとタプルの違いと類似点から、 変更可能な コレクションが必要な場合は list を使用する必要があることがわかります。
しかし、代わりにタプルを使用する必要があるのはどのような場合でしょうか?
このセクションではそれについて説明します。
#1 。読み取り専用コレクション
コレクションを不変にしたい場合は、それをタプルとして定義する必要があります。
color = (243,55,103)
、色合いに対応する RGB 値を含むタプルであるとします。カラーをタプルとして定義すると、変更できなくなります。
基本的に、コレクションを読み取り専用にする必要がある場合、つまりプログラム中に値を変更しないようにする必要がある場合は、タプルの使用を検討する必要があります。これにより、意図しない値の変更が防止されます。
#2 。辞書キー
たとえば、リスト項目
key_list
キーとして使用して辞書を作成します。
dict.fromkeys()
メソッドを使用して、リストから辞書を作成できます。
key_list = list("ABCD")
dict.fromkeys(key_list)
{'A': None, 'B': None, 'C': None, 'D': None}
辞書を作成する 前に、 最初の要素 (インデックス 0) として「D」を含むようにリストを変更するとします。
さて、辞書キー「A」はどうなるでしょうか?
key_list
から辞書を作成し、キー ‘A’ に対応する値にアクセスしようとすると、
KeyError
が発生します。
key_list[0] = 'D'
dict.fromkeys(key_list)['A']
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-31-c90392acc2cf> in <module>()
----> 1 dict.fromkeys(key_list)['A']
KeyError: 'A'
辞書のキーは一意である必要があります。したがって、2 番目の「D」をキーとして使用することはできません。
dict.fromkeys(key_list)
{'B': None, 'C': None, 'D': None} # A is no longer a key.
代わりにタプルを使用すると、そのような変更は不可能になり、エラーが発生する可能性が低くなります。したがって、タプルの項目をキーとして使用して辞書を作成することをお勧めします。
key_tuple = tuple("ABCD")
dict.fromkeys(key_tuple)
{'A': None, 'B': None, 'C': None, 'D': None}
key_tuple[0] = 'D'
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-12-2cecbefa7db2> in <module>()
----> 1 key_tuple[0] = 'D'
TypeError: 'tuple' object does not support item assignment
#3 。関数の引数
タプルは不変であるため、関数の引数として渡すのにも適しています。
長さ、幅、高さの寸法を指定して直方体の体積を返す次の関数
find_volume()
について考えてみましょう。
def find_volume(dimensions):
l,b,h = dimensions
return l*b*h
これらのディメンションが、
dimensions
というリストで利用できるとします。引数として
dimensions
を指定して
find_volume()
を呼び出すと、ボリュームが返されます。
dimensions = [2,8,5]
find_volume(dimensions)
80
リストに保存されているディメンションはいつでも変更できます。
dimensions = [20,8,5]
find_volume(dimensions)
800
ただし、値を一定に保ち、変更を防ぐ必要がある場合があります。このような場合は、引数をタプルとして保存し、関数呼び出しで使用することを検討する必要があります。
#4 。関数からの戻り値
Python では、関数からの戻り値にタプルが登場します。関数から複数の値を返すと、Python はそれらを暗黙的にタプルとして返します。
次の関数
return_even()
を考えてみましょう。
def return_even(num):
even = [i for i in range(num) if (i%2==0)]
return even,len(even)
-
引数として数値
num
を受け取ります -
[0,num)
の範囲内の偶数のリストとそのリストの長さを返します。
num
20 の値を設定して関数を呼び出してみましょう。
num = 20
return_even()
を呼び出すと、タプル内の 2 つの値が返されます。関数呼び出しを検証引数として使用して
type()
関数を呼び出すことができます。
type(return_even(num)) # <class 'tuple'>
戻り値を出力して、最初の項目として偶数のリスト、2 番目の項目としてリストの長さを含むタプルであることを確認できます。
print(return_even(num))
([0, 2, 4, 6, 8, 10, 12, 14, 16, 18], 10)
タプルには 2 つの項目があるため、以下に示すように、それらを 2 つの変数に解凍できます。
even_nums, count = return_even(num)
print(even_nums)
print(count)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
10
結論
このチュートリアルで Python タプルとリストの包括的な比較ができれば幸いです。
簡単な要約でチュートリアルを締めくくりましょう。
- リストとタプルは、Python の組み込みデータ構造です。
- 類似点 : イテラブル、インデックス作成のサポート、スライス、さまざまなデータ型、およびメンバーシップ テストの演算子。
- 主な違い : リストは変更可能ですが、タプルは不変更です。
- その他の違い : タプルの固定長とリストの可変長、タプルのメモリ サイズの縮小。
- タプルはいつ使用する必要がありますか? 不変コレクション、辞書キー、関数引数の場合。
次に、練習と学習のために Python プロジェクトをチェックしてください。または、Python リストから重複した項目を削除する方法を学びます。楽しく学習しましょう!それでは、コーディングを楽しんでください! 👩🏽💻