Python(Python3)で多数の値をまとめて使いたいときや他言語における配列のようなものを使いたいときがあると思います。そのような場合にPythonでは複数のデータを管理できるデータ構造が多数用意されています。その中でも今回は、定数のデータを管理できるタプル(tuple)について解説します。Pythonのデータ構造(list、tuple、dict、set)の比較記事も作成したので、それぞれの特徴が知りたい方はぜひそちらをご覧ください。
tupleの宣言
tupleは次のように宣言(初期化)出来ます。初期化すると同時にデータを代入することも可能です。「()」の中に入力するデータ同士をカンマ(,)で区切って入力します。要素が1つの場合はデータの後にカンマ(,)つけないと変更可能な単一のデータとして解釈されてしまいます。また、別々の型の要素でも1つのリストで扱えます。
タプル名=(要素)
#タプル名=()で初期化 #中の要素が1つのときは「,」をつけないと一つのデータとして解釈 tuple1=(1) print(type(tuple1)) tuple2=(2,) print(type(tuple2)) #データ同士は「,」で区切る tuple3=('a','b','c','d','e') #別々の型でも大丈夫 tuple4=('Tokyo',23)
実行結果
<class 'int'> <class 'tuple'>
カンマ(,)をつけなかったために、tuple1はint(整数型)として認識されています。カンマ(,)をつけることでtuple2はtupleとして認識されています。
tupleの要素の取り出し方
tupleの要素を取り出したいときは0から始まるインデックスを指定することで行えます。ちなみに、負の値を指定すると、後ろからn番目の要素を取り出すことが出来ます。
tuple1=('a','b','c','d','e') print(tuple1[0]) print(tuple1[4]) print(tuple1[-1])
実行結果
a e e
インデックスは0から始まるため、要素数がnのとき最終インデックスがn-1になることに注意すると、
tuple[n-1] tuple[-1]
は等価になります。
tupleのインデックスの取得
listのインデックスはindexメソッドもしくはリスト内包表記とenumerate関数を使用することで取得できます。
indexメソッドを使用する方法
タプル名.index(検索したい文字列)
とすることで、tupleのなかで最初にマッチする部分のインデックスを返します。マッチする要素が無かった場合はエラーとなってしまうので注意しましょう。
tuple1=('a','b','c') print(tuple1.index('b'))
実行結果
1
リスト内包表記とenumerate関数を使用する方法
[i for i,k in enumerate(リスト名) if k == 検索したい要素]
とすることで、マッチする部分のインデックスをリストで返します。マッチする部分がなかった場合でも、空のリストを返します。リスト内包表記については別の記事で詳しく解説する予定です。
tuple1=('a','b','c','a','b','c') print([i for i,k in enumerate(tuple1) if k=='a']) print([i for i,k in enumerate(tuple1) if k=='x'])
実行結果
[0, 3] []
マッチする要素が複数ある場合には、全てのマッチ部分のリストになっています。逆に、マッチする部分がない場合は、空のリストが返っています。
tupleの要素数を取得
tupleの要素数はPython3の組み込み関数lenで取得することが出来ます。
tuple1=('a','b','c','d','e') print(len(tuple1))
実行結果
5
ここで、tuple1のインデックスは0から4ですが、要素数は5になることに注意してください。
tupleの要素の追加・削除
最初に述べた通り、tupleは変更不可(イミュータブル)な値です。よって要素の追加や削除は出来ません。tupleの値を変更したい場合は一旦listに変換してから操作を行う必要があります。tupleからlistへの変換は次のように行うことが出来ます。
list(リストにしたいタプル名)
実際にlist()を用いてtupleからlistに変換してみます。
tuple1=('a','b','c','d','e') print(tuple1) print(type(tuple1)) list1=list(tuple1) print(list1) print(type(list1))
実行結果
('a', 'b', 'c', 'd', 'e') <class 'tuple'> ['a', 'b', 'c', 'd', 'e'] <class 'list'>
tuple1が「()」でくくられているのに対して、変換後のlist1が「[]」でくくられていることからも、変換が出来ていることが分かります。listの要素の追加や削除の方法は別の記事で紹介しているのでそちらをご覧ください。
Pythonでのlistの要素の追加・削除(Python3)
tupleの演算
Pythonではtuple同士で一部の演算を使用することが出来ます。和算(+)と積算(*)について確認してみましょう。
tuple1=('a','b','c') tuple2=('d','e','f') tuple1+=tuple2 print(tuple1) tuple1*=2print(tuple1)
実行結果
('a', 'b', 'c', 'd', 'e', 'f') ('a', 'b', 'c', 'd', 'e', 'f', 'a', 'b', 'c', 'd', 'e', 'f')
tupleにおける「+」はtupleを後ろにつなげる操作を示します。tupleの要素は変更不可(イミュータブル)ですが、変数の再宣言はできるため、tupleをつなげたtupleを新たに代入しています。tuple1にtuple2をつなげたtupleをtuple1として再宣言することで、最初に出力されるtuple1は'a'から'f'のアルファベットを要素に持つtupleとなります。また、tupleにおける「*」は同じtupleを末尾にn個つなげる操作を示します。二回目の出力ではtuple1を二回繰り返したtupleをtuple1に再代入しています。上の例で
tuple1*=2
となっている箇所の2の部分を任意の整数nに変えることで、tupleをn回だけつなげたtupleとなります。
この記事のまとめ
今回はPythonのtupleについて解説しました。tupleを用いることで複数のデータを簡単に扱えるようになります。この記事の要点を復習しましょう。
- 多数の変更したくない変数をまとめて扱いたいときはtuple
- tupleの要素の取り出しはtuple[n]
- tupleの要素の変更はlistに戻してから
- tupleでは「+」や「*」が使用できる
pythonのtupleを活用しましょう!