タプル(Python_08)

この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。 hirocom777.hatenadiary.org 前回までで、リストについて学びました。学ぶことが結構ありますね!!

今回もリストについて学んでいきたいと思います。 今回はタプルです。一見リストと同じように見えるのですが、何が違うのでしょうか。

タプル

タプルとは、Pythonが標準でサポートしているオブジェクトの1つです。タプルは複数の値をまとめて管理できます。以下のように記述します。

(値1, 値2, …)

ですが値が1つだけの場合、以下のように記述します。

(値1,)

それぞれの値は任意のデータ型のオブジェクトをセットできます。また、()は省略できます(コードがわかりずらくなるので、余り省略しないほうが良いです)。

タプルとリストは非常に似ているのですが、1つ大きな違いがあります。タプルは内容を修正できません。タプルはイミュータブルなオブジェクトなのです。

タプルはシーケンスなオブジェクトです。リストと同様にインデックスを使って値を参照できます。しかし修正はできません。イミュータブルだからです。

t_1 = ('A','B','C','D')

print(t_1[0]) # 'A'を返す
print(t_1[1]) # 'B'を返す
print(t_1[-1]) # 'D'を返す

t_1[1] = 'X' #エラーとなる

スライスで一部を切り出すこともできます。切り出した結果はタプル型のオブジェクトになります。

t_1 = ('A','B','C','D')

print(t_1[1:3]) # ('B', 'C')を返す

タプルはイテラブルなオブジェクトです。for文を使って要素を順番に取り出せます。

for char in ('A','B','C','D'):
    print(char, end=' ')
# A B C D と表示する

タプルどうしは、算術演算子の「+」を使って連結ができます。

t_1 = ('A','B')
t_2 = ('C','D')

print(t_1 + t_2) #('A','B','C','D')を返す

タプル以外を結合したいのであれば、tuple関数でタプル型に型変換(キャスト)する必要があります。

print(('A','B','C') + tuple('D')) #('A','B','C','D')を返す
print(('A','B','C') + 'D') #エラーとなる

要素の有無の確認も同じで、in演算子、not in演算子を使います。

print('A' in ('A','B','C')) # Trueを返す
print('E' in ('A','B','C')) # Falseを返す
print('A' not in ('A','B','C')) # Falseを返す
print('E' not in ('A','B','C')) # Trueを返す

イミュータブルなので、リストの様にappend、insert、popなどのメソッドは使えません。要素数を取得するにはlen関数を使用します。

print(len(['A','B','C'])) # 3を返す

また、リスト内包表記のような作成方法(タプル内包表記?)は存在しません。必要な場合はリスト内包表記でリストを作った後、tuple関数でタプル型に変換して作成しましょう。

この様に、タプルはリストとほとんど同じです。

なぜタプルとリストがあるのか

それではなぜタプルとリストがあるのでしょうか。以下を参考にしてみました。

docs.python.org

これによると、リストは他の言語(C,JavaScript,VB)の配列のような使い方、タプルは構造体(C,JavaScript)ユーザー定義型(VB)のような使い方をイメージしているようです。リストは可変量のデータ、タプルは関連するデータグループを扱う感じですかね。

あと、変更を許したくない場合はタプルが良いですね。

タプル内のリストは変更できる

以上のようにタプル自体は修正することができないのですが、タプル内にリスト(等のミュータブルなオブジェクト)の要素については修正可能です。

t_1 = ('A',['B','C'],'D')

t_1[1][0] ='X'
print(t_1) # ('A', ['X', 'C'], 'D')を返す

ここは注意が必要ですね。

次回は集合

いかがでしょうか。リストとタプル、違いと使い道をしっかり把握しておきたいところです。次回は同じくオブジェクトの一種、集合です。どうやって使うのでしょうか。

hirocom777.hatenadiary.org Python再学習のまとめはこちら!!