Pythonのtupleとは?
Pythonのtuple(タプル)は、複数の値をまとめて保存できる不変(イミュータブル)なシーケンス型のデータ構造です。リストと似ていますが、1度作成すると内容を変更できないという大きな違いがあります。そのため、更新したくなかったり、更新されたくなかったりするデータに使います。
作成方法も簡単で、丸括弧()で囲むか、カンマで区切るだけでOKです。もしタプルを更新したくなった場合は、リストに変換してから処理を行い、再びタプルに戻せば問題ありません。
Pythonにおけるtupleの特徴
タプルは、数学的な概念である「n項組」を表現するためのデータ構造として設計されました。そのため、関連する複数のデータを論理的にグループ化し、1つの単位として扱えます。
不変性を持っていることから、以下のようなシーンで活用できます。
- データの整合性を保証したい場合
- 辞書のキーとして使用したい場合
- 内部データを保護したい場合
- 関数から複数の値を返したい場合
- データの順序が重要で変更されたくない場合
このように様々なシーンで活用可能です。また、リストと比較して処理速度が速く、メモリ効率が良いという特徴もあります。
特に、タプルはPythonの標準ライブラリでも多用されているのもあり、効率的なプログラミングのためには避けて通れない重要なデータ構造の1つです。
【関連】
Pythonをもっと詳しく学ぶならpaizaラーニング
Pythonにおけるtupleの基本構文
Pythonにおけるtupleの基本構文は非常にシンプルです。複数の値をカンマ(,)で区切って使います。以下の基本的な作成方法と操作方法を見ていきましょう。
# 出力
('イヌ', 'ネコ', 'ウサギ')
<class 'tuple'>
タプルはカンマで区切って記述するものの、それでは見えにくいデメリットがあります。そのため上の例文でもあるように、通常は全体を()で囲んで記述します。
また、タプルの要素にアクセスするには、以下のようにインデックスを使用します。
実行結果:
イヌ
('ネコ', 'ウサギ')
この他、スライシングも可能です。ただし、1度作成したタプルの要素を変更できない点には注意しましょう。
実用例
Pythonのタプルは、様々な場面で活用できる便利なデータ構造です。ここからは以下にわけて実際のコード例を通して、タプルの実用的な使い方を紹介します。
- タプルの作成と基本操作
- 複数の値を一度に返す
- パッキングとアンパッキング
- 辞書のキーとしての利用
- タプルの内包表記
- タプルとリストの変換
- イミュータブル性の活用
- 多次元タプル
タプルの不変性や構造的な特徴を活かした例から、日常的なプログラミングで使える例まで幅広く解説していきます。どのような記述になるのか、それぞれ詳しく見ていきましょう。
タプルの作成と基本操作
タプルは、丸括弧で囲んで作成する不変のシーケンスです。インデックス参照や結合などの基本操作の他に要素の存在確認が簡単にできます。以下の例文を見てみましょう。
実行結果:
ライオン
True
('ライオン', 'ゾウ', 'キリン', 'パンダ', 'ペンギン', 'カンガルー')
リストと違い内容変更はできませんが、データの整合性を保証したい場合に活用してみてください。
複数の値を一度に返す
関数から複数の値を返す場合には、タプルが便利です。Pythonでは複数の値をカンマ区切りで返すとタプルとして扱われ、受け取る側でも個別の変数に簡単に分解できます。これをアンパッキングと呼び、コードの可読性と保守性を高めます。
どのように使うのか、以下の例文を見てみましょう。
実行結果:
イヌは5歳の柴犬です
データの流れがわかりやすいプログラムを記述するには、関数の入力や出力が明快かどうかが大切なポイントです。例文のようにタプルを使い、可読性と保守性の高いコードを記述していきましょう。
パッキングとアンパッキング
タプルのパッキングとアンパッキングは、変数の効率的な操作を可能にします。複数の値を1つのタプルにまとめたり、逆にタプルから個別の変数に値を割り当てたりできます。以下が例文です。
実行結果:
クマ トラ ワニ
イヌ ネコ
パッキングとアンパッキングは、変数の交換や一部の値だけを取り出す場合に、特に便利です。活用していきましょう。
辞書のキーとしての利用
tupleはイミュータブルな性質を持つため、辞書のキーとしても使用できます。以下の例文を見てみましょう。
実行結果:
1500
辞書のキーとして使用すると、上記のように「動物」と「地域」のような複合情報をキーとした辞書を作成できます。複数の条件で情報を整理・検索する場合に役立ちます。
タプルの内包表記
タプル内包表記を使うと、既存のシーケンスから新しいタプルを簡潔に作成できます。
例えばlen関数を使った以下の例文を見てみましょう。
実行結果:
(2, 2, 3, 5)
('イヌ', 'ネコ', 'ウサギ')
コードを見るとわかるように、実際には括弧内はジェネレータ式です。()の前にtupleと表記して変換する必要があります。また、条件式を追加することで、特定の条件を満たす要素だけを含めるのも可能です。
タプルとリストの変換
タプルとリストは簡単に相互変換できます。不変性が必要な場合はタプル、内容変更が必要な場合はリストを使うというように、用途に応じてデータ構造を切り替えられます。どのように使うのか、以下の例文を見てみましょう。
実行結果:
['ウマ', 'ウシ', 'ブタ', 'ヤギ']
('ウマ', 'ウシ', 'ブタ', 'ヤギ')
こうした柔軟性は、Pythonプログラミングの大きな強みです。活用していきましょう。
イミュータブル性の活用
タプルの不変性は、意図しないデータ変更から保護する場合に役立ちます。例えば、絶滅危惧種リストのような変更されるべきでないデータを扱う際に特に有用です。以下のように記述します。
実行結果:
('アムールトラ', 'ジャイアントパンダ', 'シロサイ')
('ホッキョクグマ', 'アムールトラ', 'ジャイアントパンダ', 'シロサイ')
もし、元のデータを保持しながら新しい情報を追加したくなった場合は、新しいタプルを作成します。
多次元タプル
タプルは、ネスト構造にして多次元データを表現できます。動物園の動物情報のように、複数の関連データをまとめて扱いたい場合に便利です。ネストしたタプルの各要素にインデックスを使ってアクセスでき、ループ処理でデータを簡単に取り出せます。
どのように記述するのか、以下の例文を見てみましょう。
実行結果:
ライオン
ライオンは10歳のオスです
トラは5歳のメスです
上のコードでは、for文を使用してタプルの要素を全て取り出しています。多次元のタプルを記述する際は、併せて覚えておくとよいでしょう。
まとめ
Pythonのタプルは、不変なシーケンス型データ構造として様々なシーンで活躍します。複数の値を効率的に扱え、処理速度が速く、メモリ効率も良いという特徴があります。関数から複数の値を返したり、パッキングとアンパッキング機能で変数操作を効率化したりすることも可能です。
特に、データの不変性が求められる場面では、積極的にタプルの使用を検討してみてください。リストと違い1度作成すると変更できないため、データの整合性保証や辞書のキーなどに最適です。
初心者の方もタプルの基本を理解して活用することで、よりクリーンで効率的なPythonコードが書けるようになるでしょう。