タプルは、データのコレクションを保存するために使用される Python の組み込みデータ型です。これはリストに似ていますが、リストよりわずかに高速です。
ただし、その制限により、状況によってはリストの方が望ましい場合もあります。この記事では、タプルを使い始めるために知っておくべきことをすべて説明します。
タプルとは何ですか?
前述したように、タプルは、データのコレクションを保存するために使用される Python の組み込みデータ型の 1 つです。これは、データを反復可能な配列のような形式で保存するという点で Python リストに似ています。ただし、リストとは異なり、タプルは不変です。つまり、一度作成すると、その値は変更できません。
追加の要素を追加したり、既存の要素を削除したりすることはできません。したがって、タプルは、変更されないデータを保存する場合に最適です。さまざまな種類のデータの集合である場合もあります。次のセクションでは、Python でタプルを作成するさまざまな方法について説明します。
Python でタプルを作成するには?
Python でタプルを作成するには少なくとも 3 つの方法があります。このセクションでは、他のコードを読み取るときに使用したり目にする可能性が高い 3 つの最も一般的な方法について説明します。
次のコード例を実行するには、Python がインストールされている必要があります。 Python をまだインストールしていない場合は、Python をインストールするための役立つガイドを次に示します。あるいは、 Google Colab などのオンライン Python ランタイムでコードを実行することもできます。
#1. タプル リテラル (括弧) の使用
Python で定義されたタプルを確認する最も一般的な方法は、かっこの間に値のコレクションを配置することです。これらの値はカンマで区切られます。次の例は、この方法を示しています。
# Creates a tuple by placing values between parentheses
values = (1, 2, 3)
# Printing out the tuple to the screen
print(values)
# Printing out the type of values variable
print(type(values))
このコードを実行すると、以下が生成されます。

出力からわかるように、タプルは初期化した値を保持しています。これも
<class 'tuple'>
型です。
Python でタプルを作成する場合、括弧は必要ありません。したがって、この
values = 1, 2, 3
この
values = (
1, 2, 3) と同様に有効です。ただし、コードをわかりやすくするためにかっこを使用することをお勧めします。
Python で 1 つの要素を含むタプルを作成するのは少し難しいです。かっこの間に 1 つの要素を配置するだけでなく、末尾にカンマを追加する必要もあります。以下に例を示します。
# Without trailing comma, this won't create a tuple
not_a_tuple = (1)
# With trailing comma, this will create a tuple
a_tuple = (1,)
# Printing not_a_tuple
print(not_a_tuple)
# Printing not_a_tuple's data type
print(type(not_a_tuple))
# Printing a_tuple
print(a_tuple)
# Printing a_tuple's data type
print(type(a_tuple))

上記のコードを実行すると、
not_a_tuple
値 1 の
int
になることがわかります。これは、タプルを作成するときに留意することが重要です。
#2. コンストラクター関数の使用
Python でタプルを作成する 2 番目の方法では、タプル コンストラクター関数を使用します。このメソッドでは、リストのような反復可能なオブジェクトを引数として渡して関数を呼び出します。これはタプルに変換されます。以下に例を示します。
# Creating tuple from a list of values
values = tuple([1, 2, 3])
# Printing out the values
print(values)
# Printing out the data type of the values identifier
print(type(values))

ご覧のとおり、関数を使用すると、リテラルを使用した場合と同じ結果が得られます。ただし、この関数を使用すると、値が実行時にのみ判明するリストなど、動的な値に基づいてタプルを作成できます。最初の方法では、コードを記述するときにタプルを構成する値または識別子を知っている必要があります。
#3. 空のタプルの作成
コード内でタプルを操作する場合、空のタプルを作成することが必要になる場合があります。空のタプルは期待どおりに作成されます。タプル コンストラクターまたはリテラル to を作成するときに使用できます。どちらかの方法の使用方法を示す例を次に示します。
# Using the tuple literal
empty_tuple_1 = ()
# Using the constructor
empty_tuple_2 = tuple()
空のタプルは、空の結果セットを表す場合に便利です。次の関数を考えてみましょう。
def create_range(start, end):
return tuple(range(start, end))
この関数は、最初から渡した最後の値までの値を含むタプルを作成します。関数の結果を反復処理する場合は、次のようなものを使用します。
my_values = create_range(0, 5)
for value in my_values:
pass
create_range 関数に 5 と 5 を指定した場合、結果は空のタプルになります。そして、それを反復処理しようとすると、反復回数がゼロになるだけで、コードは通常どおり処理されます。
一方、空のタプルがなく、代わりに None 値を取得した場合、それを反復しようとするとエラーがスローされます。プログラムのクラッシュを防ぐには、create_range 関数が None または空のタプルを表すその他の値を返すというエッジ ケースのテストを実装する必要があります。
これにより、コードが乱雑になる可能性があります。理想的には、特殊なケースはできる限り回避する必要があります。これは、コードが可能な限り一般的なケースで動作するように、すべての関数の戻り値が同一のインターフェイスを持つ必要があることを意味します。この場合、空の場合もありますが、常にタプルを返すことを意味します。
要素にアクセスする方法
Python でタプルの要素にアクセスするには 2 つの方法があります。 1 つ目の方法はインデックスによるもので、2 つ目は要素を構造化することによるものです。まず、インデックスによって要素にアクセスする方法を検討します。
インデックスによる要素へのアクセス
インデックスを使用して要素にアクセスする方法は、インデックスを使用してリストの要素にアクセスする方法と似ています。これは角括弧表記を使用して行われます。タプルはゼロベースのインデックス システムを使用します。つまり、最初の要素はインデックス 0、その後の要素は最後の要素までインデックス 1 になります。
以下の例は、インデックスによって要素にアクセスする方法を示しています。
# Creating a tuple
values = (1, 2, 3, 4)
# Accessing the first element
first_element = values[0]
# Accessing the fourth element(index 3)
fourth_element = values[3]
負のインデックスを使用することもできます。インデックス -1 の要素は最後の要素であり、インデックス -2 の要素は最後の要素から 2 番目です。
# Creating the tuple
values = (1, 2, 3, 4)
# Accessing the last element
last_element = values[-1]
# Accessing the second from last element
second_from_last_element = values[-2]
さらに、タプルをスライスすることで、タプルの要素のサブコレクションにアクセスすることもできます。これはリストをスライスする方法と似ています。表記は次のとおりです
<tuple>[<start>: <end>: <skip>]
。次の例は、スライスを示しています。
# Creating the tuple
values = (1, 2, 3, 4, 5, 6, 7)
# Getting the first three elements
values[1: 3]
# Getting every other element
values[::2]
要素の反復処理
タプルは Python の反復可能なオブジェクトです。したがって、次の例に示すように、for ループを使用してその要素を反復処理できます。
values = (1, 2, 3, 4)
for value in values:
print(value)
要素にアクセスするこの方法は、タプル内のすべての要素にアクセスする場合に最適です。
構造化による要素へのアクセス
構造化を説明するために、タプル内のさまざまな要素を取得しようとする次のシナリオを考えてみましょう。
# Creating the tuple to record a user's information
person_record = (1, 'John Doe', 'john@example.com')
# Accessing the different elements in the tuple to use in our code
id = person_record[1]
name = person_record[2]
email = person_record[3]
Python では、以下に示すように、より便利な方法を使用して値にアクセスできます。
# Creating the tuple to record a user's information
person_record = (1, 'John Doe', 'john@example.com')
id, name, email = person_record
これを構造の破壊といいます。つまり、最初の変数 (この場合は
id
にはタプル内の最初の値が割り当てられ、2 番目の変数は 2 番目の要素に割り当てられます。これはタプルの最後まで続きます。上の例は次と同等です。
id, name, email = (1, 'John Doe', 'john@example.com')
この場合、タプルを変数に保存するのではなく、すぐにそれを構造化します。これを、タプルを作成するときに括弧を使用する必要がないという知識と組み合わせると、次のようなコードを書くことができます。
id, name, email = 1, 'John Doe', 'john@example.com'
これをすべて終えると、値 1、「John Doe」、および「john@example.com」を持つ id、name、および email 変数が得られます。これは、実稼働コードで使用される Python で変数を作成する便利で簡潔な方法です。このエレガントな構文の中心にあるのはタプルの概念であることを知っておくと役立ちます。
タプルとリストの違い
この 2 つは似ていますが、いくつかの重要な違いにより、それぞれが特定の使用例により適したものになります。これらの違いを理解すると、使用する最適なデータ型を決定し、より適切で効率的なコードを作成するのに役立ちます。
側面 | タプル | リスト |
メモリストレージ | 連続したメモリに保存される | メモリのさまざまな部分に保存する |
可変性 | 不変(変更不可) | Mutable (変更可能) |
スピード | アクセスが速くなります | アクセスが遅くなる |
データ・タイプ | 通常、さまざまな種類のデータを保存します | 通常は同じ種類のデータを格納します |
ユースケース | 通常は、マークなどの類似した値のコレクションを保存するために使用されます。 | 通常は、マークなどの類似した値のコレクションを保存するために使用されます。 |
タプルの利点
#1. より速いです
タプルの値は連続したメモリに格納されるため、リストに比べて値へのアクセスが高速になります。ただし、タプルは一度作成すると変更できないため、値のコレクションを格納するために使用するのに最適なデータ構造であるとは限りません。
理想的な使用例は、変更されないがプログラムの実行中に何度もアクセスされる大量のデータをメモリに保存することです。この場合、プログラムはタプルのパフォーマンス向上によって多大な恩恵を受けることになります。
#2. 複数の値を返す
タプルを使用すると、関数から複数の値を返し、結果を構造化できます。例えば:
from random import randint
def create_two_numbers():
first_num = randint(0, 9)
second_num = randint(0, 9)
return first_num, second_num
first_num, second_num = create_two_numbers()
この例では、2 つの乱数を作成し、両方をタプルで返す関数があります。
return first_num, second_num
ステートメントは
return (first_num, second_num)
を記述することと同じです。これは、タプルを作成するときに括弧がオプションであるためです。結果にアクセスするには、結果を構造化します。
#3. 値は書き込み保護されています
タプルは一度作成されると不変になります。したがって、プログラムの実行中に変更されないデータをメモリに保存するのに最適です。これらにより、コード内の別の場所にデータを誤って上書きすることがなくなります。
#4. 複数のデータ型を保存する
タプルを使用すると、複数のデータ型の値を保存できます。これにより、ユーザーの詳細をタプルに保存するなど、データのレコードを作成できます。関数、辞書、その他のタプル、さらにはリストなど、より複雑な項目を保存することもできます。
一般的なタプルメソッド
#1. カウント()
タプル オブジェクトには、要素の出現回数をカウントする count メソッドが含まれています。例えば:
# Creating a tuple with several numbers
values = (1, 2, 3, 4, 5, 4, 4, 6)
# Counting the number of fours
n_fours = values.count(4)
# Prining out the number of fours
print(n_fours)

この例から、タプル内に数値 4 がちょうど 3 回出現することがわかります。
#2. 索引()
インデックス メソッドを使用すると、タプル内で最初に出現する値のインデックスを見つけることができます。値が存在しない場合は、
ValueError
例外がスローされます。以下に、
index
メソッドがどのように機能するかを示すコードをいくつか示します。
# Creating a tuple with several numbers
values = (1, 2, 3, 4, 5, 4, 4, 6)
# Search for index of 4
index_of_four = values.index(4)
print("Index of four:", index_of_four)
# Search for index of 9
index_of_nine = values.index(9)
print("Index of nine:", index_of_nine)
上記のコードを実行すると、次の出力が得られます。

この場合、4 のインデックスは 3 であり、コードは問題なく実行されました。しかし、インデックス 9 を見つけることになると、プログラムは例外を発生させました。インデックス メソッドを使用する Python プログラムを作成する場合は、このような例外を処理することが重要です。
#3. レン()
Python のすべての反復可能なオブジェクトと同様に、タプルには
len()
関数の引数としてタプルを渡すときにアクセスできる length プロパティがあります。
# Creating a tuple
values = (1, 2, 3, 4)
# Getting the length
length = len(values)
# Print the output
print(length)

これは上記のコードを実行した結果です。
#4. min() と max()
min メソッドと max メソッドは、反復可能内の各要素をループし、その要素がその前の要素より大きいか小さいかを比較することによって機能します。最終的に、
max
反復可能な要素内の最大の要素を返し、
min
最小の要素を返します。
数字があれば操作は一目瞭然です。文字列の場合、Python はアルファベット順を使用します。
min
によって返される最小の単語は、文字列がアルファベット順に書かれている場合の最初の単語です。最大の単語は最後の単語です。反復可能オブジェクトに異なるデータ型が混在している場合、Python は異なるデータ型を比較する方法がわからないため、両方の操作が失敗します。
コード例は次のとおりです。
# Creating tuple with values
values = (1, 2, 3, 4, 5)
# Getting the largest value
largest = max(values)
# Getting the smallest value
smallest = min(values)
# Output the results
print(largest)
print(smallest)

#5. ソート済み()
Python のsorted関数は反復可能なオブジェクトを受け取り、ソートされた要素のリストを返します。 sorted 関数を呼び出し、引数としてタプルを渡し、リスト内でソートされたタプルの要素を取得できます。ソートされたリストをタプルに変換するには、コンストラクター関数を使用できます。以下に例を示します。
# Creating a tuple with values in random order
values = (1, 5, 3, 3, 2, 4)
# Using sorted to sort the values into a list
sorted_list = sorted(values)
# Converting the list into a tuple
sorted_tuple = tuple(sorted_list)
# Printing the output
print(sorted_tuple)

#6. タプルの加算と乗算
2 つのタプルに対する加算演算は、単にそれらを連結するだけです。乗算演算では、乗算した値と同じ回数だけタプルの要素が繰り返されます。 2 つの例を説明するための例を次に示します。
# Create a tuple with some values
values = (1, 2, 3, 4, 5)
# Create a new tuple using addition
added = values + values
# Create a new tuple using multiplication
multiplied = values * 2
print("values + values =", added)
print("values * 2 =", multiplied)

最後の言葉
この記事では、次のことを学びました。
- タプルは、値のコレクションを格納するために使用されるリストのようなオブジェクトです。
- リストとは異なり、リストは不変です。
- リストよりも高速かつ効率的です。
- これらは括弧を使用し、値をカンマで区切って構築できます。
-
tuple
コンストラクター関数を使用して構築することもできます。 - ゼロから始まるインデックス システムを使用して個々の値にアクセスできます。
- タプルから値を分解することもできます。
- for ループを使用して値を反復処理することもできます。
- タプルで使用できるさまざまなメソッド。
次に、Python リスト メソッドや Python 辞書メソッドなど、その他の Python コンテンツを確認してみるとよいでしょう。