Pythonを勉強するために本を買ったけど,積読してる.
最初の方の数値や算術演算,文字列の扱いで止まっている.
似たデータ型でリストってあるけど,違いは何?
できる操作は違うの?
そんな方が,タプルを理解して,辞書や集合の学習に進むための記事です.
本記事の内容
前回の「リスト」から,複合データ型を解説しています.今回は「タプル」です.まずはタプルの作成とデータ(個々の要素)の取得方法を,その後要素の追加方法,リストとの違いなどを解説します.これまでの記事と同様に,コードを打ちながら学んで行きましょう.余力のある方は,部分的にコードを変更して実験してみましょう.
タプルとは|作成方法
タプルは,複数のデータに順番をつけて,ひとまとめにしたデータです.表1に示すように,ミュータブルが×となっています.すなわち,リストと異なり,タプルでは要素の書き換えができません.ただし,既存のタプルを連結して,新しいタプルを作成することはできます.
表1.複合データ型
型(クラス) | ミュータブル※1 | シーケンス型※2 |
---|---|---|
リスト(lis | ○ | ○ |
タプル(tuple) | × | ○ |
辞書(dict) | ○ | × |
集合(set) | ○ | × |
※1: ミュータブル:同じオブジェクトで中の値を書き換え可能.
※2: シーケンス型:順序を持つ.
タプルを使う場面としては,元号と西暦,日付,カラーコードの組み合わせ,フォネティックコード,塩基とアミノ酸など,組み合わせから構成されているデータで利用します.タプルとリストの違いの詳細については,本記事の最終節で解説します.まずは,タプルの作成方法を学びながら,実行結果がどのように表示されるかをみてみましょう.
タプルの作成
0個以上の要素(タプル内のオブジェクト)をカンマで区切り,( )(丸括弧)で囲んで記述します.ただ,リストと異なり,括弧をつけなくてもタプルを定義できます.リストと同様に,比較的長いデータにすることができるので,変数に代入して,短いコードで表現できます.
0個以上の要素をカンマで区切り,丸括弧で囲んで記述する.(括弧をつけなくても良い)
(-3, -2, 1, 0, 1, 2, 3)
("さとう", "しお", "す", "せうゆ", "みそ")
"砂糖", "塩", "酢", "醤油", "味噌" # 括弧をつけなくても良い.
変数に代入できる.
tuple_ex1_1 = (-3, -2, 1, 0, 1, 2, 3)
tuple_ex1_2 = -3, -2, 1, 0, 1, 2, 3 # 括弧がなくても良いが,括弧をつけるとタプルだとわかりやすい.
tuple_ex2_1 = ("砂糖", "塩", "酢", "醤油", "味噌") tuple_ex2_1
tuple_ex2_2 = "砂糖", "塩", "酢", "醤油", "味噌" list_ex2_2
各要素を,一度に個別の変数へ代入できる.(左辺の変数が,要素と同じ個数である場合)
tuple_ex3 = ("Alpha", "Bravo", "Charlie", "Delta", "England") a, b, c, d, e = tuple_ex3
a
b
c
d
e
a, b, c, d, e # a~eをカンマで区切りにして,タプルとして出力
異なる型が混在しても良い.
tuple_ex4 = ("西暦", 2023, "令和", 5) tuple_ex4
同じ要素を含んでも良い.
tuple_ex5 = (0, 0, 255) # Blueのカラーコード tuple_ex5
タプルを入れ子できる.
tuple_ex6 = (("砂糖", "酒", "みりん"), "塩", "酢", "醤油", "味噌") tuple_ex6
要素が1個のタプルは末尾にカンマをつける.
"砂糖",
("砂糖",)
tuple_ex7_1 = "砂糖", tuple_ex7_1
tuple_ex7_2 = ("砂糖",) tuple_ex7_2
tuple_ex7_x = ("砂糖") # カンマをつけなければ,タプルではなくなる. tuple_ex7_x
何も記述しない場合,空タプルとなる.
tuple_empty = ()
まとめ
- 0個以上の要素をカンマで区切り,丸括弧で囲んで記述する.(括弧をつけなくても良い)
- 変数に代入できる.
- 各要素を,一度に個別の変数へ代入できる.(左辺の変数が,要素と同じ個数である場合)
- 異なる型が混在しても良い.
- タプルを入れ子できる.
- 要素が1個のタプルは末尾にカンマをつける.
- 何も記述しない場合,空タプルとなる.
型の確認
type()関数を使って確認します.「tuple」と表示されるか確認してみましょう.
ただし,いくつかのイレギュラーも確認してください.例えば,tuple_ex2_1 と tuple_ex2_2 は,それぞれ括弧の有無が異なるタプルでしたが,代入した変数をtype()関数の引数に渡せます.
type(tuple_ex2_1) # tuple_ex2_1 = ("砂糖", "塩", "酢", "醤油", "味噌")
type(tuple_ex2_2) # tuple_ex2_2 = "砂糖", "塩", "酢", "醤油", "味噌"
一方,括弧がないタプルをそのままtype()関数の引数に渡せません.
type("砂糖", "塩", "酢", "醤油", "味噌") # 括弧がないタプルを引数にできない.
TypeError Traceback (most recent call last)
—-> 1 type(“砂糖”, “塩”, “酢”, “醤油”, “味噌”)
TypeError: type() takes 1 or 3 arguments
要素が1つのタプルではカンマをつけるだけで記述できました.しかし,このままの状態で関数の引数として渡すことはできません.
type("砂糖", )
変数に代入するか,丸括弧をつけていれば,関数の引数に渡せます.
# tuple_ex7_1 = "砂糖", type(tuple_ex7_1)
#tuple_ex7_2 = ("砂糖",) type(tuple_ex7_2)
タプルへのデータ型の変換
tuple()関数を使って,データ型をタプルに変換できます.
文字列をタプルに変換
リストと同様に,文字列シーケンスを一文字ずつ分割して,タプルに変換できます.
tuple("タプルにするで!")
リストをタプルに変換
list_ex = ["タ", "プ", "ル", "に", "す", "る", "で", "!"] tuple(list_ex)
要素の取得
文字列やリストと同様に,インデックスを使用して要素の一部を取得できます.
リストの記事で示した例を,タプルに書き換えて例を示します.
tuple_num = (0, 1, 2, 3, 4, 5, 6, 7, 8)
[開始値:停止値:間隔]→指定した開始値から停止値の1つ手前まで,指定した間隔ごとの要素
tuple_num[0:6:2]
リストでの配列をタプルに書き換えて試してみてください.
タプルの操作
タプルはイミュータブルなので,リストのように書き換え,すなわち置換,削除,並べ替えができません.そのようなメソッドも定義されていません.ただし,前述のように,+演算子を用いて既存のタプルを連結したり,*演算子を用いて既存のタプルを繰り返し追加したりすることはできます.
表2.タプルの操作一覧
操作 | 関数・メソッド | 演算子ほか | インデックス |
---|---|---|---|
連結 | +, += | ||
追加 | * | ||
検索・取得 | .index(), .count(), len() | in | ◯ |
後述のように,リストとタプルには,構成されるデータに若干の違いがあります違いがあります.ただ,操作を理解しやすくするために,リストの記事と同じ要素で練習してみましょう.
タプルの連結
+演算子
prime1 = (2, 3, 5, 7, 11) prime2 = (13, 17, 19, 23) prime1 + prime2 # prime1 + prime2を出力.次のコードのように,変数に代入することも可能.
prime1 = (2, 3, 5, 7, 11) prime2 = (13, 17, 19, 23) Prime1 += prime2 # 代入演算子を用いて,prime1=prime1+prime2とすることもできる. Prime1 # prime1を出力
タプルの追加
*演算子
fibo1 = (0, "golden ratio", 1, 1, 2, 3, 5, 8) fibo1 *= 2 # 代入演算子を用いて,fibo1 = fibo1*2とすることもできる. fibo1
要素の検索
取得は前述のとおりです.
わかりやすくするために,リストと同じ要素のタプルで示します.
.index()メソッド → 要素のオフセットを調べる
fibo1 = (0, 1, 1, 2, 3, 5, 8) fibo1.index(8)
fibo1.index(1) # 同じ要素があると最初の値のオフセットが出力される.
.count()メソッド → 要素の個数を調べる
fibo1.count(8)
fibo1.count(1) # 1は2つある.
len()関数 → リスト内の要素数を調べる
len(fibo1)
in → 要素の有無を調べる
8 in fibo1
4 in fibo1
タプルとリストの違い
リストは変更可能で,タプルは変更できませんでしたね.そのほかにどのような違いがあるのか,引用を紹介します.
- リストは変更可能で,タプルは変更不可
- リストは大抵同じ型の要素,タプルは複数の型の要素からなることが多い.
- タプルは,複数のデータの組み合わせから構成されているデータ.
タプルはリストと似ていますが、たいてい異なる場面と異なる目的で利用されます。タプルは不変で、複数の型の要素からなることもあり、要素はアンパック(この節の後半に出てきます)操作やインデックス (あるいは namedtuples の場合は属性)でアクセスすることが多いです。一方、リストは可変で、要素はたいてい同じ型のオブジェクトであり、たいていイテレートによってアクセスします。
複数のデータの組み合わせから構成されているデータを表現する場合、タプル という種類のオブジェクトを利用します。
タプル(tuple)というのはあんまり聞き慣れない言葉ですが、組 などとも呼ばれ、複数の要素が決まった順番にならんだ値を指します。
タプルについて,基本を学べましたでしょうか?
次は「辞書」について学びましょう!
最後まで読んでくださり,ありがとうございます☺️