想定読者
- Python勉強したて。型について知りたい
- Pythonのtuple型について知りたい
- 理解の助けになる実装例を知りたい
- int, float, str, list型について知っている
目的
- tuple型についてわかる
- 利用用途が分かる
tupleとは
- 公式リファレンス
- 必ずしも知っている必要はないが、知ってると便利なデータ型(個人的な認識ですが)
- 値の組みを入れておく箱。listとの違いは、listと異なり要素の追加・変更・削除ができないことと、hash関数でハッシュ化できる
tupleを使うメリット
-
ハッシュ化できる。特に、dictのキーに複数の値を使ってキーにすることができる
-
listよりちょっとメモリ使用量が少ない
>>> from sys import getsizeof >>> getsizeof( (1, 2, 3) ) 72 >>> getsizeof( [1, 2, 3] ) 88
tupleの文法
a = (1, 2, 3) # 要素3つのtuple
b = (1,) # 要素1つのtuple
c = () # 要素0つのtuple
d = (1) # これは、dはintの1として扱われる(計算式のカッコとして扱われる)ためtupleにならない
e = 1, 2 # カッコは、実はなくても良い
f = 1, # たまに、間違えてカンマが入ってしまって、整数値などがtupleになってしまうことがあるので、注意
- tupleオブジェクトは
()
で囲む - 要素は
,
で区切って書く - 要素が一つだけのtupleを作る場合は、要素の後にカンマを入れる
(1,)
tupleへのバリューの出し入れ
a = (1, 2, 3)
print(a[0]) # -> 1
print(a[:2]) # -> (1, 2)
- listと同じように、取り出したい番号を
[]
で囲ってアクセスする - listと同じようにスライスを使って、一部分を取り出すことができる
>>> a = (1,2,3)
>>> a[0] = 10
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
- tupleオブジェクトに対して値の上書きはできない
応用例1
組み合わせの数を数える
下の例では、名前と性別の組み合わせの頻度を計算する
user_list = [
{'名前': '田中', '性別': '男'},
{'名前': '鈴木', '性別': '男'},
{'名前': '鈴木', '性別': '男'},
{'名前': '田中', '性別': '女'},
{'名前': '鈴木', '性別': '女'},
{'名前': '田中', '性別': '女'},
]
# 数えるための辞書を0で初期化。tupleはdictのキーにすることができる(要素が全てhash化できない場合を除く)
count_dict = {
('田中', '男'): 0,
('田中', '女'): 0,
('鈴木', '男'): 0,
('鈴木', '女'): 0,
}
# user_listから要素を取り出し、user変数に入れてループ
for user in user_list:
# user変数から、名前・性別キーにアクセスし、tupleを生成
key = (user['名前'], user['性別'])
# count_dictに上記のキーを使って値を取り出し、1追加して再度格納
count_dict[key] = count_dict[key] + 1
print( count_dict[ ('鈴木', '男') ] ) # -> 2
print( count_dict[ ('鈴木', '女') ] ) # -> 1
応用例2
簡単な値オブジェクトの作成
ある概念を表すオブジェクトを簡易的に作りたい時に使えます。namedtuple
を使うと、dictのように要素が何を表しているのかをわかりやすくすることができます。
tupleは要素数が固定なので、予め要素数が決まった概念を表すのに適しています
例えば、下の例では、量と単位を持ったお金の概念をnamedtupleで作ります。
(お金の概念に計算は定義していないので、お金オブジェクト同士の四則演算などはできません)
from collections import namedtuple
# namedtupleを使ってお金のtupleを作るためのクラスを作る
# namedtupleは第一引数はクラス名, 第二引数は要素名(カンマ区切り)を表す
Money = namedtuple('MoneyClass', 'amount,unit')
money1 = Money(100, '円')
money2 = Money(200, '円')
money3 = Money(100, '円')
print(money1) # -> MoneyClass(amount=100,unit='円')
print(money1 != money2) # -> False (異なる値をもつお金は異なる物と扱われる)
print(money1 == money3) # -> True (同じ値をもつお金は同じ物と扱われる)
# namedtupleはtupleとして扱うことができます
print(money1[0]) # -> 100
print(money1[1]) # -> '円'
# namedtupleの要素にはdot演算子と要素名を使ってアクセスすることもできます
print(money1.amount) # -> 100
print(money1.unit) # -> '円'