【Pythonのデータ構造】タプル(Tuple)の使い方<定義~要素の操作方法>【徹底解説】

スポンサーリンク
Pythonの基礎文法(タプルの使い方) Python

重要度:★★★★

Pythonは通常の「データ処理」の他、「AI」や「機械学習」で用いられるライブラリが豊富に提供されている、現在もっとも人気のあるプログラミング言語です。

そのため、他の言語にはない「配列」や「行列・ベクトル」などを扱うための特別なデータ構造が用意されています。Pythonでプログラムを書くくためのファーストステップとして、データ構造を深く理解することが何よりも重要となります。


Pythonが提供するデータ構造には大きく「リスト」「タプル」「辞書」の3種類があります。

図1 Pythonのデータ構造

それぞれ次のような特徴があります。

リスト(List)

[要素1, 要素2, ・・・] のように、”[]”(角カッコ)の中に要素が“,”(カンマ)区切りで並びます。リストは、ミュータブル(mutable)なデータ構造で、要素の追加・更新・削除を自由に行うことができます。

他言語の配列に近い扱い方がありますが、次のような違いがあります。

<他言語の配列との違い>
  • 要素には、さまざまなデータ型(整数、文字列など)を混在することができる
  • C言語のようにメモリアドレスを強く意識しない

リストの詳細については、こちらの記事で解説していますので参考にして下さい。


辞書(dictionary)

{key1:value1, key2:value2, } のように、“{}”(中カッコ)の中に、キー:値を1組とする要素が“,”(カンマ)区切りで並びます。タプルもリスト同様にミュータブル(mutable)なデータ構造で、要素の追加・更新・削除を自由に行うことができます。リストやタプルとの違いは次のようなものがあります。

<リスト(List)との違い>
  • 要素の並び順を意識することはない(キーを識別子として各要素にアクセスする)
  • 同じキーを重複してもたせることはできない(値は重複できます)。

辞書の詳細については、こちらの記事で解説していますので参考にして下さい。


タプル(Tuple)

(要素1, 要素2, ・・・) のように、”()”(カッコ)の中に要素が“,”(カンマ)区切りで並びます。

タプルは、リストと類似していますがイミュータブルなデータ構造となります。つまり、リストのように一度定義したタプルは、要素の追加・更新・削除を行うことができません。

リストとの違いは次のようなものがあります。

<リスト(List)との違い>
  • イミュータブルで要素の追加・更新・削除ができない
  • リストよりも、生成速度が速く、メモリーの使用量が小さい

今回は、この「タプル(Tupple)」について「データ構造の基本」から「作り方(定義の方法)」「要素へのアクセス(参照・取得・更新)」「タプル型の関数」について基礎から丁寧に図解で解説をします。

この記事を読むことで次のことが「できるわかる」ようになりますので最後までお付き合い下さい。

  1. タプル(Tupple)データ構造の基本と作り方(定義の仕方)
  2. タプルの各要素へのアクセス方法(参照・取得・更新)について
  3. タプル型が提供する標準関数やメソッドについて

本サイトでの紹介内容は一例です。また、関数などの省略可能なオプション引数などについては割愛していますので、詳細や不明点などは必要に応じて公式サイトなどを参照してください。

【Python公式ドキュメント】https://docs.python.org/ja/3/library/stdtypes.html#mapping-types-dict

スポンサーリンク

1. タプルをつくる


リストがミュータブルなデータ構造であるのに対し、タプルはイミュータブルとなります。

つまり、リストは作成後、要素を追加・削除・変更が可能ですが、タプルではそのようなことはできません。

Pythonには定数がありませんが、タプルは定数の代わり(完全に定数ではありません)使われることが多くあります。

本節では、タプルの作り方からリストとの相違点の例を示しながら解説を進めます。

Python 公式ドキュメント

https://docs.python.org/ja/3/library/stdtypes.html#tuple

1.1. タプルのつくりかた

タプルの構造

➀タプルはカッコ”(“,  “)”の中に要素をカンマ ”, ”区切りされたデータ構造

  タプル: (要素1、要素2、・・・・)

以下にて、タプルのつくり方の例を紹介します。


例1.タプルをつくる方法はいくつか用意されています。代表的な3例を紹介します。

まずは、もっとも基本的な方法で丸カッコ(“,  )の中に要素を入れていくパターンです。要素は、整数、文字列または型混載などができます。(

# <タプル> 基本的な作り方1

print( ('a', 'b') )             #➀ ('a', 'b') 文字列を要素とする
print( (123, 456) )             #➁ (123, 456) 数値を要素とする
print( ('a', 123) )             #➂ ('a', 123) 文字列と数値を混合させることができる

文字列を要素とする

》(‘a’, ‘b’)

数値を要素とする

》(123, 456)

文字列と数値を混合させることができる

》(‘a’, 123)


2つ目は、要素を カンマ ,  区切りで記述する方法でもつくることができます。()

要素が1つのみの場合は、後ろにカンマを付ける必要があります。

# <タプル> 基本的な作り方2

t1 = 'a', 'b'
t2 = 123, 456
t3 = 'a',           #要素が1個のみの場合

print(t1)           #➃ ('a', 'b')
print(t2)           #➄ ('a', 'b')
print(t3)           #➅ ('a',)

》(‘a’, ‘b’)

》(123, 456)

》(‘a’,)


そして最後3つ目は、標準関数 tuple() を使う方法です。

引数は1つだけ指定することができ、標準関数 range() や文字列またはリストを指定することで効率的にタプルをつくることができます。(

# <タプル> 基本的な作り方3

print(tuple(range(-2, 2)))      #➆ (-2, -1, 0, 1)
print(tuple('abc'))             #➇ ('a', 'b', 'c')

lst = ['abc', 'def', 1]
print(tuple(lst))               #➈ ('abc', 'def', 1)

》(-2, -1, 0, 1)

》(‘a’, ‘b’, ‘c’)

》(‘abc’, ‘def’, 1)

ちなみに、引数を2つ以上指定すると次のようにエラーが発生します。()

print(tuple(1, 2, 3))           #➉ エラー
#TypeError: tuple expected at most 1 arguments, got 3

TypeError: tuple expected at most 1 arguments, got 3


例2.タプルの要素には、文字列や数値以外に、リストやタプルといったオブジェクトも要素に持つことができます。()

# <タプル> タプル構造のネスト

print( ( (10, 20), (30, 40) ) )         #➀ ((10, 20), (30, 40)) タプルの要素にタプル
print( ( [10, 20], [30, 40] ) )         #➁ ([10, 20], [30, 40]) リストをタプルの要素にする
print( ( 10, 20, [30, 40], 'abc' ) )    #➂ (10, 20, [30, 40], 'abc') 混載できる

タプルの要素にタプル(ネスト構造)

》((10, 20), (30, 40))

リストをタプルの要素にする

》([10, 20], [30, 40])

数値・文字列・オブジェクトを混載できる

》(10, 20, [30, 40], ‘abc’)

スポンサーリンク

2. タプルをつかう

本節ではタプルの使い方を解説します。

基本的な使い方は、リストと同様ですので、リストと対比しながら読み進めると理解が進むでしょう。イミュータブルなデータ構造であるタプルを上手に使うことが重要です

また、タプル特有の使い方として”アンパック、組込み関数”zip()”があり使用例を紹介しています。

Python 公式ドキュメント

https://docs.python.org/ja/3/library/stdtypes.html#tuple

2.1 タプルをつかう

タプルを使う

➀タプルの要素の参照方法

  (要素1、要素2、要素3)[ index ] (使い方はリストと同じ)

➁タプル要素の取得(アンパック)

➂タプル要素の包含関係を調べる

  in演算子(リストと同様)

➃タプルの比較(値、オブジェクト

  値: ==演算子など ,  is演算子など その他詳細は「演算子の記事を参照」

  

以下にて、タプルの使い方の例を紹介します。


例1. タプルの中のオブジェクトを参照するには、次のように角カッコ ” [ ” ” ] “ を使います。インデックスの指定方法はリスト同様です。先頭から0,1,2といったように指定できます。➀➁

また、負数を指定することで末尾から指定できるのもリストと同様です。➂

#<リスト>の参照方法

print( (10, 20, 30, 40, 50)[0] )            #➀ 10
print( (10, 20, 30, 40, 50)[4] )            #➁ 50
print( (10, 20, 30, 40, 50)[-1] )           #➂ 50
#-------------------------------------------

タプルの要素がタプルやリストの場合も同様に角カッコ ” [ ” ” ] “とインデックスで参照することができます。➂~➅

#要素がタプル
print( ( (10, 20), (30, 40) )[0])           #➂ (10, 20)
print( ( (10, 20), (30, 40) )[0][0])        #➃ 10

#要素がリスト
print( ( [10, 20], [30, 40] )[0] )          #➄ [10, 20]
print( ( [10, 20], [30, 40] )[0][0] )       #➅ 10
#-------------------------------------------

例2. 次の例はインデクスを使わずにタプルオブジェクトから要素を取り出す方法を紹介します。

変数(タプルの要素数分) = タプルオブジェクトで各変数に要素を取り出すことができます。➀~➂のように指定できます。また、➂では値の交換を行うことができます。

#タプルのアンパック
(a, b) = ('a1', 'b1')
print(a); print(b)              #➀ a1   b1

a, b = ('a2', 'b2')
print(a); print(b)              #➁ a2   b2

a, b = 'a3', 'b3'
print(a); print(b)              #➂ a3   b3
#-------------------------------------------

2.2 タプルに関連する組込み関数

組込み関数

➀タプルの最大、最小、合計など

  sum(), max(), min() 引数にはタプルオブジェクトを指定する

➁複数のリストを列結合したタプルをつくる

  zip([リスト1 a1, a2, a3,・・・], [リスト2 b1, b2, b3],・・・)

zip()の戻り値: (a1, b1…) , (a2, b2…) , (a3, b3…) ・・・

例1.タプルもリスト同様に数値計算用の標準関数を利用することができます。

num = (15, 21, 59, 9, 42, 68)

print(sum(num))             #➀ 214  要素の合計値
print(max(num))             #➁  68  要素の最大値
print(min(num))             #➂  9   要素の最小値
#-------------------------------------------

例2.リストを効率的にアンパックするためにzip()という標準関数が用意されています。複数のリストオブジェクトを引数に指定すると各リストの要素順にアンパックされたタプルを戻り値に返します。

list1 = [11, 12, 13]
list2 = [21, 22, 23]
list3 = [31, 32, 33]

print(type(zip(list1, list2, list3)))   #➀ <class 'zip'> zipオブジェクト

print(list(zip(list1, list2, list3)))   #➁ [(11, 21, 31), (12, 22, 32), (13, 23, 33)]
#-------------------------------------------
スポンサーリンク

3. まとめ

最後に、この記事のまとめになります。

  • タプルはリストと同様に操作することができる
  • タプルはイミュータブルなオブジェクトで後から変更できない
  • タプル特有の使い方としてアンパックやzip()などがある

最後までお読み頂きありがとうございました。

次の記事では、もう一つのデータ構造(辞書)について解説します。

タイトルとURLをコピーしました