この連載では、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関数でタプル型に変換して作成しましょう。
この様に、タプルはリストとほとんど同じです。
なぜタプルとリストがあるのか
それではなぜタプルとリストがあるのでしょうか。以下を参考にしてみました。
これによると、リストは他の言語(C,JavaScript,VB)の配列のような使い方、タプルは構造体(C,JavaScript)ユーザー定義型(VB)のような使い方をイメージしているようです。リストは可変量のデータ、タプルは関連するデータグループを扱う感じですかね。
あと、変更を許したくない場合はタプルが良いですね。
タプル内のリストは変更できる
以上のようにタプル自体は修正することができないのですが、タプル内にリスト(等のミュータブルなオブジェクト)の要素については修正可能です。
t_1 = ('A',['B','C'],'D') t_1[1][0] ='X' print(t_1) # ('A', ['X', 'C'], 'D')を返す
ここは注意が必要ですね。
次回は集合
いかがでしょうか。リストとタプル、違いと使い道をしっかり把握しておきたいところです。次回は同じくオブジェクトの一種、集合です。どうやって使うのでしょうか。