タプル

タプルの宣言

タプル(tuple)はリストに似た機能であり、複数の値を1つのタプルで管理できる。タプルはリストが[]で宣言するところを()で宣言する。

タプル名 = (値1, 値2, ...)
tuple = (10, 20.55, "value")
# 要素が1つのタプルは値にカンマをつける
tuple2 = 100,
# タプルはカッコ省略できる
tuple3 = 10, 20.55, "value"

# 実行結果
print(tuple)
(10, 20.55, 'value')
print(tuple2)
(100,)
print(tuple3)
(10, 20.55, 'value')

リストと同じく多次元タプルにすることが可能。

tuple = ((1, 2, 3), (4, 5, 6))
# 多次元配列ではネストしたタプルのカッコは省略できない
tuple2 = ("value1", "value2"), (7, 8, 9)
# 実行結果
print(tuple)
((1, 2, 3), (4, 5, 6))
print(tuple2)
(('value1', 'value2'), (7, 8, 9))

タプルの連結

+=演算子と+演算子でタプルとタプルを連結できる。

a = (1, 2, 3)
b = (4,)
a += b
print(a)
# 実行結果
(1, 2, 3, 4)
a += (5, 6)
print(a)
# 実行結果
(1, 2, 3, 4, 5, 6)
a = (1, 2, 3)
b = (4, 5, 6)
c = a + b    # 2つのタプルを連結しタプルcに代入
print(c)

# 実行結果
(1, 2, 3, 4, 5, 6)

タプルとリストの違い

リストは要素を追加や削除、値の変更ができるミュータブル(変更可能)な機能だが、タプルはできない定数のようなイミュータブル(変更不可能)な機能。

ただしタプルは中身が変更できないが、タプルを代入した変数の中身は変更可能。例えばtuple1 = (1, 2);と宣言したタプルに直接要素を追加削除したり値の変更はできない。しかし(,3)などと連結させtuple1に再代入することでtuple1が上書きされ(1, 2, 3)と内容は変更される。

tuple1 = (1, 2)
tuple1[0] = 5    # 先頭の要素1を5に上書きしようとしてエラー↓
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

タプルはその特性から辞書のキーとして利用できる。

tuple関数でタプルを作る

組み込み関数のtuple()を使うと効率よくタプルを作ることができる。他の型の値をタプルに変換も可能。

# -3~3の連番のタプルを作成
tuple1 = tuple(range(-3, 3))
print(tuple1)
# 実行結果
(-3, -2, -1, 0, 1, 2, 3)

# 文字列を一文字ずつ分解してタプルを作成
tuple2 = tuple("あいうえお")
print(tuple2)
# 実行結果
('あ', 'い', 'う', 'え', 'お')

# リストをタプルに変換
list1 = [1, 2, 3]
tuple3 = tuple(list1)
print(tuple3)
# 実行結果
(1, 2, 3)

# タプルをリストに変換
tuple4 = (1, 2, 3)
list2 = list(tuple4)
print(list2)
# 実行結果
[1, 2, 3]

タプルをスライスする

タプルもリストや文字列のように要素の一部を切り出す、即ちスライスできる。

タプル[開始位置:終了位置:ステップ]
tuple1 = (1, 2, 3, 4, 5)
# tuple1の先頭から3番目の要素を切り出す
slice_tuple1 = tuple1[:3]
print(slice_tuple1)
# 実行結果
(1, 2, 3)

# tuple1から要素を1個飛ばしで切り出す
slice_tuple2 = tuple1[::2]
print(slice_tuple2)
(1, 3, 5)

タプルの要素を取り出す

タプルはリストと同じくインデックスで指定して取り出せる。複数取り出すには後述する機能スライスを使う。

tuple1 = (1, 2, 3, 4, 5)
print(tuple1[0])    # 先頭を指定
# 実行結果
1
print(tuple[2])    # 3番目を指定
# 実行結果
3
print(tuple[-1])    # -1を指定すると末尾を意味する
# 実行結果
5

タプルの全要素を順番に取り出すには、リストと同じくfor文を使う。

tuple1 = (1, 2, 3, 4, 5)
for item in tuple1:    # tuple1の要素が先頭から順にitemに代入される
    print(item)
# 実行結果
1
2
3
4
5

enumerate()関数で繰り返した回数を添えることができる。以下のコードはiに回数、itemに要素が代入される。

tuple1 = ("one", "two", "three")
for i,item in enumerate(tuple1):
    print(i, item)
# 実行結果
0 one
1 two
2 three
for i,item in enumerate(tuple1, 1):    # 1から数える(指定が無ければ0から)
    print(i, item)
# 実行結果
1 one
2 two
3 three

タプルのアンパック

(1, 2)などのタプルが代入される変数側もタプル形式(a, b)などにして代入すると、aに1、bに2がそのまま代入される。これをタプルのアンパックという。

(a, b) = (1, 2)
print(a)
# 実行結果
1
print(b)
# 実行結果
2

タプルに特定の値が含まれるか調べる

タプルに特定の値が含まれるか調べるにはin演算子を使う。

language = ("c", "python", "java", "php", "javascript")
if "javajava" in language:    # javajavaがタプルに存在するかチェック
    print("含まれます")
else:
    print("含まれません")
# 実行結果
含まれません    # javaなら「含まれる」と表示

 

タプルの最大値、最小値、合計を求める

数値のタプルの最大値、最小値、合計は組み込み関数のmax()、min()、sum()で求めることが出来る。これはリストも同じ。

numbers = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
print(max(numbers))
# 実行結果
10
print(min(numbers))
# 実行結果
1
print(sum(numbers))
# 実行結果
55

タプル同士を比較する

2つのタプルを比較する場合、値を比較するのかオブジェクトを比較するのかで結果が異なる。値の比較は==演算子、オブジェクトの比較はis演算子を使う。

変数bには変数aのオブジェクトが入っているが、タプルはイミュータブルなのでbを変更したもaまで変更されることはない。

a = (1, 2, 3)
b = a    # bにaのオブジェクトの参照が入る
c = (1, 2, 3)
if a == b:    # 値を比較
    print("値が一致")
if a is b:    # オブジェクトを比較
    print("オブジェクトが一致")
if a == c:    # 値を比較
    print("値が一致")
if a is c:    # オブジェクトを比較
    print("オブジェクトが不一致")

コメント

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