「Pythonの基礎 - タプルの作成と操作」の版間の差分
細 文字列「<source lang="python">」を「<syntaxhighlight lang="python">」に置換 |
編集の要約なし |
||
| (同じ利用者による、間の1版が非表示) | |||
| 1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
タプルとは、リストと同様に様々なデータの要素を格納して管理することができる。<br> | タプルとは、リストと同様に様々なデータの要素を格納して管理することができる。<br> | ||
リストと異なるのは、タプルは要素を後で追加・削除・変更することができないというのが特徴である。これをイミュータブル (不変) と呼ぶ。<br> | |||
<br> | |||
タプルはイミュータブルであるため、以下に示すような特徴がある。<br> | |||
* ハッシュ可能であり、辞書のキーや集合の要素として使用できる。 | |||
* リストよりもメモリ効率が良い。 | |||
* 関数の戻り値として複数の値を返す際によく使用される。 | |||
* データの整合性を保証したい場合に適している。 | |||
<br><br> | <br><br> | ||
== タプルの定義 == | == タプルの定義 == | ||
タプルを作成するには丸括弧() | タプルを作成するには丸括弧 <code>()</code> を使用し、カンマで要素を区切る。<br> | ||
タプル名 = (要素1, 要素2, 要素3, ...) | タプル名 = (要素1, 要素2, 要素3, ...) | ||
<br> | |||
また、空のタプルを作成するには、丸括弧 <code>()</code> のみで宣言する。<br> | |||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
t1 = (1, 3, 5, 3, 7, 5) | t1 = (1, 3, 5, 3, 7, 5) | ||
| 20行目: | 28行目: | ||
(2, 7, 8, 3, 9, 1) | (2, 7, 8, 3, 9, 1) | ||
() | () | ||
</ | </syntaxhighlight> | ||
<br> | |||
タプルの両端の丸括弧は省略できる。(ただし、空のタプルは除く)<br> | |||
<br> | <br> | ||
タプルも要素にインデックスが割り当てられている。<br> | タプルも要素にインデックスが割り当てられている。<br> | ||
| 32行目: | 42行目: | ||
30 | 30 | ||
(40, 50, 60, 70, 80) | (40, 50, 60, 70, 80) | ||
</ | </syntaxhighlight> | ||
<br> | |||
負のインデックスを使用して、末尾から要素にアクセスすることもできる。<br> | |||
<syntaxhighlight lang="python"> | |||
t = (10, 20, 30, 40, 50) | |||
print(t[-1]) # 末尾の要素 | |||
print(t[-2]) # 末尾から2番目の要素 | |||
print(t[-3:]) # 末尾から3つの要素 | |||
# 出力 | |||
50 | |||
40 | |||
(30, 40, 50) | |||
</syntaxhighlight> | |||
<br> | <br> | ||
要素が1つだけのタプルを作成する場合、後ろにカンマを付けることでタプルと認識する。<br> | 要素が1つだけのタプルを作成する場合、後ろにカンマを付けることでタプルと認識する。<br> | ||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
x = (200,) | x = (200,) | ||
y = 300, | y = 300, | ||
z = (400) # これはタプルではなく整数 | |||
print(x) | print(x) | ||
print(type(x)) | |||
print(y) | print(y) | ||
print(type(y)) | |||
print(z) | |||
print(type(z)) | |||
# 出力 | # 出力 | ||
(200,) | (200,) | ||
<class 'tuple'> | |||
(300,) | (300,) | ||
</ | <class 'tuple'> | ||
400 | |||
<class 'int'> | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
== タプルのメソッドと操作 == | == タプルのメソッドと操作 == | ||
==== タプルのメソッド (index関数とcount関数) ==== | |||
タプルには、<code>index</code> 関数 と <code>count</code> 関数がある。<br> | |||
<br> | |||
<code>index</code> 関数は、指定した要素が最初に出現するインデックスを返す。<br> | |||
<code>count</code> 関数は、指定した要素がタプル内に何回出現するかを返す。<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
t = (1, 2, 4, 6, 8, 5, 2, 7, 4, 4) | t = (1, 2, 4, 6, 8, 5, 2, 7, 4, 4) | ||
print(t.index(2)) | print(t.index(2)) # 整数値2が最初に出現するインデックス | ||
print(t.count(4)) | print(t.count(4)) # 整数値4の出現回数 | ||
# 出力 | # 出力 | ||
1 | 1 | ||
3 | 3 | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
===== タプルの結合 | <code>index</code> 関数は、要素が見つからない場合に、<code>ValueError</code> 例外を発生させる。<br> | ||
<br> | |||
<syntaxhighlight lang="python"> | |||
t = (1, 2, 3) | |||
# t.index(99) # ValueError: tuple.index(x): x not in tuple | |||
</syntaxhighlight> | |||
<br> | |||
==== タプルの結合 ==== | |||
タプルは要素の操作はできないが、タプル同士の結合を行うことができる。<br> | タプルは要素の操作はできないが、タプル同士の結合を行うことができる。<br> | ||
以下の例では、2つのタプルのそれぞれの要素が、1つのタプルの要素として結合されている。<br> | 以下の例では、2つのタプルのそれぞれの要素が、1つのタプルの要素として結合されている。<br> | ||
<br> | |||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
t1 = (1, 2, 3) | t1 = (1, 2, 3) | ||
| 71行目: | 115行目: | ||
# 出力 | # 出力 | ||
(1, 2, 3, 10, 20, 30) | (1, 2, 3, 10, 20, 30) | ||
</ | </syntaxhighlight> | ||
<br> | |||
==== タプルの繰り返し ==== | |||
<code>*</code> 演算子を使用して、タプルの要素を繰り返すことができる。<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | |||
t = (1, 2, 3) | |||
print(t * 3) | |||
</syntaxhighlight> | |||
<br> | |||
# 出力 | |||
(1, 2, 3, 1, 2, 3, 1, 2, 3) | |||
<br> | |||
==== タプルの要素としてリストを持つ場合 ==== | |||
タプルの要素はリストを持つことができる。<br> | |||
タプルの要素としてリストを変更することはできないが、リストの中の要素の変更はすることができる。<br> | |||
<br> | <br> | ||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
t = ([2, 4, 6], [1, 3, 5]) | t = ([2, 4, 6], [1, 3, 5]) | ||
# t[0] = 100 | # t[0] = 100 # TypeError: 'tuple' object does not support item assignment | ||
t[1][0] = 100 | t[1][0] = 100 | ||
print(t) | print(t) | ||
</syntaxhighlight> | |||
<br> | |||
# 出力 | # 出力 | ||
([2, 4, 6], [100, 3, 5]) | ([2, 4, 6], [100, 3, 5]) | ||
<br> | <br> | ||
==== tuple関数でtuple型に変換する ==== | |||
<code>tuple</code> 関数を使用すると、他のイテラブルなデータ型からタプルを作成することができる。<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
# リストからタプルへの変換 | |||
lang = ["Python", "JavaScript", "Swift"] | lang = ["Python", "JavaScript", "Swift"] | ||
print(tuple(lang)) | print(tuple(lang)) | ||
# 文字列からタプルへの変換 | |||
s = "Hello" | |||
print(tuple(s)) | |||
# rangeからタプルへの変換 | |||
r = range(5) | |||
print(tuple(r)) | |||
</syntaxhighlight> | |||
<br> | |||
# 出力 | # 出力 | ||
('Python', 'JavaScript', 'Swift') | ('Python', 'JavaScript', 'Swift') | ||
</ | ('H', 'e', 'l', 'l', 'o') | ||
(0, 1, 2, 3, 4) | |||
<br><br> | |||
== 組み込み関数との併用 == | |||
タプルは、様々な組み込み関数と併用することができる。<br> | |||
<br> | |||
==== len関数 ==== | |||
<code>len</code> 関数は、タプルの要素数を返す。<br> | |||
<syntaxhighlight lang="python"> | |||
t = (10, 20, 30, 40, 50) | |||
print(len(t)) | |||
</syntaxhighlight> | |||
<br> | |||
# 出力 | |||
5 | |||
<br> | |||
==== max関数とmin関数 ==== | |||
<code>max</code> 関数 と <code>min</code> 関数は、タプルの要素の最大値と最小値を返す。<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | |||
t = (10, 50, 30, 20, 40) | |||
print(max(t)) | |||
print(min(t)) | |||
</syntaxhighlight> | |||
<br> | |||
# 出力 | |||
50 | |||
10 | |||
<br> | |||
==== sum関数 ==== | |||
<code>sum</code> 関数は、タプルの数値要素の合計を返す。<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | |||
t = (10, 20, 30, 40, 50) | |||
print(sum(t)) | |||
</syntaxhighlight> | |||
<br> | |||
# 出力 | |||
150 | |||
<br> | |||
==== sorted関数 ==== | |||
<code>sorted</code> 関数は、タプルの要素をソートしたリストを返す。(タプルではなくリストが返される)<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | |||
t = (30, 10, 50, 20, 40) | |||
print(sorted(t)) | |||
print(tuple(sorted(t))) # タプルとして取得する場合 | |||
</syntaxhighlight> | |||
<br> | |||
# 出力 | |||
[10, 20, 30, 40, 50] | |||
(10, 20, 30, 40, 50) | |||
<br> | |||
==== in演算子 ==== | |||
<code>in</code> 演算子を使用して、タプル内に特定の要素が含まれているかを確認できる。<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | |||
t = ("Python", "JavaScript", "Swift") | |||
print("Python" in t) | |||
print("Java" in t) | |||
print("Java" not in t) | |||
</syntaxhighlight> | |||
<br> | |||
# 出力 | |||
True | |||
False | |||
True | |||
<br><br> | <br><br> | ||
| 98行目: | 234行目: | ||
タプルを使用すれば、複数の変数に1文で値を渡すことができる。<br> | タプルを使用すれば、複数の変数に1文で値を渡すことができる。<br> | ||
<br> | <br> | ||
以下の例では、3つの値を持ったタプルと3つの変数を用意して、タプルを代入している。<br> | |||
変数のそれぞれの位置とタプルの値が対応しているのが分かる。(これをタプルのアンパックと呼ぶ)<br> | 変数のそれぞれの位置とタプルの値が対応しているのが分かる。(これをタプルのアンパックと呼ぶ)<br> | ||
<br> | |||
いくつでも対応させることができるが、変数が多くなると可読性が落ちる。<br> | いくつでも対応させることができるが、変数が多くなると可読性が落ちる。<br> | ||
<br> | |||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
lang = ("Python", "JavaScript", "Swift") | lang = ("Python", "JavaScript", "Swift") | ||
| 107行目: | 245行目: | ||
print(JS) | print(JS) | ||
print(Sw) | print(Sw) | ||
</syntaxhighlight> | |||
<br> | |||
# 出力 | |||
Python | |||
JavaScript | |||
Swift | |||
<br> | |||
==== アスタリスクを使用したアンパッキング ==== | |||
アスタリスク <code>*</code> を変数の前に付けることで、残りの要素をリストとして受け取ることができる。<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | |||
t = (1, 2, 3, 4, 5) | |||
first, *rest = t | |||
print(first) | |||
print(rest) | |||
*start, last = t | |||
print(start) | |||
print(last) | |||
first, *middle, last = t | |||
print(first) | |||
print(middle) | |||
print(last) | |||
</syntaxhighlight> | |||
<br> | |||
# 出力 | |||
1 | |||
[2, 3, 4, 5] | |||
[1, 2, 3, 4] | |||
5 | |||
1 | |||
[2, 3, 4] | |||
5 | |||
<br> | |||
==== 変数の値の交換 ==== | |||
タプルのアンパッキングを利用して、変数の値を簡単に交換することができる。<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | |||
a = 10 | |||
b = 20 | |||
a, b = b, a | |||
print(a) | |||
print(b) | |||
</syntaxhighlight> | |||
<br> | |||
# 出力 | # 出力 | ||
20 | |||
10 | |||
<br> | |||
</ | ==== 関数の戻り値としてのタプル ==== | ||
関数から複数の値を返す場合、タプルがよく使用される。<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | |||
def get_min_max(numbers): | |||
return min(numbers), max(numbers) | |||
result = get_min_max([3, 1, 4, 1, 5, 9, 2, 6]) | |||
print(result) | |||
min_val, max_val = get_min_max([3, 1, 4, 1, 5, 9, 2, 6]) | |||
print(min_val) | |||
print(max_val) | |||
</syntaxhighlight> | |||
<br> | |||
# 出力 | |||
(1, 9) | |||
1 | |||
9 | |||
<br><br> | <br><br> | ||
== タプルの比較 == | |||
タプルは辞書順 (レキシコグラフィック順序) で比較される。<br> | |||
最初の要素から順に比較し、異なる要素が見つかった時点で比較結果が決まる。<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | |||
print((1, 2, 3) < (1, 2, 4)) | |||
print((1, 2, 3) < (1, 3, 2)) | |||
print((1, 2) < (1, 2, 0)) | |||
print((1, 2, 3) == (1, 2, 3)) | |||
</syntaxhighlight> | |||
<br> | |||
# 出力 | |||
True | |||
True | |||
True | |||
True | |||
<br><br> | |||
== 辞書のキーとしてのタプル == | |||
タプルはイミュータブル (不変) であるため、ハッシュ可能である。<br> | |||
これにより、タプルは辞書のキーや集合の要素として使用することができる。<br> | |||
<br> | |||
リストはミュータブルであるため、辞書のキーとして使用できない。<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | |||
# タプルを辞書のキーとして使用 | |||
location = { | |||
(35.6762, 139.6503): "Tokyo", | |||
(40.7128, -74.0060): "New York", | |||
(51.5074, -0.1278): "London" | |||
} | |||
print(location[(35.6762, 139.6503)]) | |||
</syntaxhighlight> | |||
<br> | |||
# 出力 | |||
Tokyo | |||
<br> | |||
複数のキーを組み合わせて辞書にアクセスする場合にも便利である。<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | |||
# 複合キーとしての使用例 | |||
sales = { | |||
("2024", "Q1"): 1000, | |||
("2024", "Q2"): 1500, | |||
("2024", "Q3"): 1200, | |||
("2024", "Q4"): 1800 | |||
} | |||
print(sales["2024", "Q2"]) # 丸括弧は省略可能 | |||
</syntaxhighlight> | |||
<br> | |||
# 出力 | |||
1500 | |||
<br> | |||
ただし、タプルの要素にリスト等のミュータブルなオブジェクトが含まれている場合は、ハッシュ可能ではなくなるため、辞書のキーとして使用できない。<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | |||
# タプルの要素にリストが含まれている場合 | |||
t = ([1, 2], [3, 4]) | |||
# d = {t: "value"} # TypeError: unhashable type: 'list' | |||
</syntaxhighlight> | |||
<br><br> | |||
== 名前付きタプル (namedtuple) == | |||
<code>collections</code> モジュールの <code>namedtuple</code> を使用すると、フィールド名でアクセスできるタプルを作成することができる。<br> | |||
通常のタプルはインデックスでしか要素にアクセスできないが、名前付きタプルは属性名でアクセスできるため、コードの可読性が向上する。<br> | |||
<br> | |||
==== 基本的な使い方 ==== | |||
<syntaxhighlight lang="python"> | |||
from collections import namedtuple | |||
# 名前付きタプルの定義 | |||
Point = namedtuple('Point', ['x', 'y']) | |||
# インスタンスの作成 | |||
p = Point(10, 20) | |||
# フィールド名でアクセス | |||
print(p.x) | |||
print(p.y) | |||
# インデックスでもアクセス可能 | |||
print(p[0]) | |||
print(p[1]) | |||
</syntaxhighlight> | |||
<br> | |||
# 出力 | |||
10 | |||
20 | |||
10 | |||
20 | |||
<br> | |||
==== フィールド名の指定方法 ==== | |||
フィールド名は、リスト、タプル、またはスペース区切りの文字列で指定できる。<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | |||
from collections import namedtuple | |||
# リストで指定 | |||
Point1 = namedtuple('Point1', ['x', 'y']) | |||
# タプルで指定 | |||
Point2 = namedtuple('Point2', ('x', 'y')) | |||
# スペース区切りの文字列で指定 | |||
Point3 = namedtuple('Point3', 'x y') | |||
# カンマ区切りの文字列で指定 | |||
Point4 = namedtuple('Point4', 'x, y') | |||
</syntaxhighlight> | |||
<br> | |||
==== 名前付きタプルのメソッド ==== | |||
名前付きタプルには、いくつかの便利なメソッドがある。<br> | |||
<br> | |||
<code>_asdict</code> メソッドは、名前付きタプルを辞書として返す。<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | |||
from collections import namedtuple | |||
Person = namedtuple('Person', ['name', 'age', 'city']) | |||
p = Person('Alice', 30, 'Tokyo') | |||
print(p._asdict()) | |||
</syntaxhighlight> | |||
<br> | |||
# 出力 | |||
{'name': 'Alice', 'age': 30, 'city': 'Tokyo'} | |||
<br> | |||
<code>_replace</code> メソッドは、指定したフィールドの値を置き換えた新しい名前付きタプルを返す。(元のタプルは変更されない)<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | |||
from collections import namedtuple | |||
Person = namedtuple('Person', ['name', 'age', 'city']) | |||
p1 = Person('Alice', 30, 'Tokyo') | |||
p2 = p1._replace(age=31) | |||
print(p1) | |||
print(p2) | |||
</syntaxhighlight> | |||
<br> | |||
# 出力 | |||
Person(name='Alice', age=30, city='Tokyo') | |||
Person(name='Alice', age=31, city='Tokyo') | |||
<br> | |||
<code>_fields</code> 属性は、フィールド名のタプルを返す。<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | |||
from collections import namedtuple | |||
Person = namedtuple('Person', ['name', 'age', 'city']) | |||
print(Person._fields) | |||
</syntaxhighlight> | |||
<br> | |||
# 出力 | |||
('name', 'age', 'city') | |||
<br> | |||
==== typing.NamedTupleを使用した型ヒント付きの名前付きタプル ==== | |||
Python 3.6以降では、<code>typing.NamedTuple</code> を使用して、型ヒント付きの名前付きタプルを定義できる。<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | |||
from typing import NamedTuple | |||
class Point(NamedTuple): | |||
x: float | |||
y: float | |||
label: str = "origin" # デフォルト値を設定可能 | |||
p = Point(1.0, 2.0) | |||
print(p) | |||
print(p.label) | |||
</syntaxhighlight> | |||
<br> | |||
# 出力 | |||
Point(x=1.0, y=2.0, label='origin') | |||
origin | |||
<br><br> | |||
== タプルとリストの使い分け == | |||
タプルとリストは似ているが、それぞれ適した用途がある。<br> | |||
<br> | |||
<center> | |||
{| class="wikitable" | |||
|+ タプルとリストの比較 | |||
! 特徴 !! タプル !! リスト | |||
|- | |||
| 変更可能性 || イミュータブル (変更不可) || ミュータブル (変更可能) | |||
|- | |||
| メモリ効率 || より効率的 || やや非効率 | |||
|- | |||
| 辞書のキー || 使用可能 || 使用不可 | |||
|- | |||
| 用途 || 固定データ、座標、レコード || 動的なコレクション | |||
|} | |||
</center> | |||
<br> | |||
==== タプルを使用すべき場面 ==== | |||
* データが変更されるべきではない場合 | |||
* 辞書のキーや集合の要素として使用する場合 | |||
* 関数から複数の値を返す場合 | |||
* メモリ効率が重要な場合 | |||
<br> | |||
==== リストを使用すべき場面 ==== | |||
* データの追加、削除、変更が必要な場合 | |||
* 同種のデータのコレクションを扱う場合 | |||
* 順序付きのデータを動的に操作する場合 | |||
<br><br> | |||
{{#seo: | |||
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki | |||
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板 | |||
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux | |||
|image=/resources/assets/MochiuLogo_Single_Blue.png | |||
}} | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:Python]] | [[カテゴリ:Python]] | ||
2026年2月1日 (日) 07:47時点における最新版
概要
タプルとは、リストと同様に様々なデータの要素を格納して管理することができる。
リストと異なるのは、タプルは要素を後で追加・削除・変更することができないというのが特徴である。これをイミュータブル (不変) と呼ぶ。
タプルはイミュータブルであるため、以下に示すような特徴がある。
- ハッシュ可能であり、辞書のキーや集合の要素として使用できる。
- リストよりもメモリ効率が良い。
- 関数の戻り値として複数の値を返す際によく使用される。
- データの整合性を保証したい場合に適している。
タプルの定義
タプルを作成するには丸括弧 () を使用し、カンマで要素を区切る。
タプル名 = (要素1, 要素2, 要素3, ...)
また、空のタプルを作成するには、丸括弧 () のみで宣言する。
t1 = (1, 3, 5, 3, 7, 5)
t2 = 2, 7, 8, 3, 9, 1
t3 = ()
print(t1)
print(t2)
print(t3)
# 出力
(1, 3, 5, 3, 7, 5)
(2, 7, 8, 3, 9, 1)
()
タプルの両端の丸括弧は省略できる。(ただし、空のタプルは除く)
タプルも要素にインデックスが割り当てられている。
このインデックスを使用して、要素を抽出・スライスすることができる。
t = (10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
print(t[2])
print(t[3:8])
# 出力
30
(40, 50, 60, 70, 80)
負のインデックスを使用して、末尾から要素にアクセスすることもできる。
t = (10, 20, 30, 40, 50)
print(t[-1]) # 末尾の要素
print(t[-2]) # 末尾から2番目の要素
print(t[-3:]) # 末尾から3つの要素
# 出力
50
40
(30, 40, 50)
要素が1つだけのタプルを作成する場合、後ろにカンマを付けることでタプルと認識する。
x = (200,)
y = 300,
z = (400) # これはタプルではなく整数
print(x)
print(type(x))
print(y)
print(type(y))
print(z)
print(type(z))
# 出力
(200,)
<class 'tuple'>
(300,)
<class 'tuple'>
400
<class 'int'>
タプルのメソッドと操作
タプルのメソッド (index関数とcount関数)
タプルには、index 関数 と count 関数がある。
index 関数は、指定した要素が最初に出現するインデックスを返す。
count 関数は、指定した要素がタプル内に何回出現するかを返す。
t = (1, 2, 4, 6, 8, 5, 2, 7, 4, 4)
print(t.index(2)) # 整数値2が最初に出現するインデックス
print(t.count(4)) # 整数値4の出現回数
# 出力
1
3
index 関数は、要素が見つからない場合に、ValueError 例外を発生させる。
t = (1, 2, 3)
# t.index(99) # ValueError: tuple.index(x): x not in tuple
タプルの結合
タプルは要素の操作はできないが、タプル同士の結合を行うことができる。
以下の例では、2つのタプルのそれぞれの要素が、1つのタプルの要素として結合されている。
t1 = (1, 2, 3)
t2 = (10, 20, 30)
print(t1 + t2)
# 出力
(1, 2, 3, 10, 20, 30)
タプルの繰り返し
* 演算子を使用して、タプルの要素を繰り返すことができる。
t = (1, 2, 3)
print(t * 3)
# 出力 (1, 2, 3, 1, 2, 3, 1, 2, 3)
タプルの要素としてリストを持つ場合
タプルの要素はリストを持つことができる。
タプルの要素としてリストを変更することはできないが、リストの中の要素の変更はすることができる。
t = ([2, 4, 6], [1, 3, 5])
# t[0] = 100 # TypeError: 'tuple' object does not support item assignment
t[1][0] = 100
print(t)
# 出力 ([2, 4, 6], [100, 3, 5])
tuple関数でtuple型に変換する
tuple 関数を使用すると、他のイテラブルなデータ型からタプルを作成することができる。
# リストからタプルへの変換
lang = ["Python", "JavaScript", "Swift"]
print(tuple(lang))
# 文字列からタプルへの変換
s = "Hello"
print(tuple(s))
# rangeからタプルへの変換
r = range(5)
print(tuple(r))
# 出力
('Python', 'JavaScript', 'Swift')
('H', 'e', 'l', 'l', 'o')
(0, 1, 2, 3, 4)
組み込み関数との併用
タプルは、様々な組み込み関数と併用することができる。
len関数
len 関数は、タプルの要素数を返す。
t = (10, 20, 30, 40, 50)
print(len(t))
# 出力 5
max関数とmin関数
max 関数 と min 関数は、タプルの要素の最大値と最小値を返す。
t = (10, 50, 30, 20, 40)
print(max(t))
print(min(t))
# 出力 50 10
sum関数
sum 関数は、タプルの数値要素の合計を返す。
t = (10, 20, 30, 40, 50)
print(sum(t))
# 出力 150
sorted関数
sorted 関数は、タプルの要素をソートしたリストを返す。(タプルではなくリストが返される)
t = (30, 10, 50, 20, 40)
print(sorted(t))
print(tuple(sorted(t))) # タプルとして取得する場合
# 出力 [10, 20, 30, 40, 50] (10, 20, 30, 40, 50)
in演算子
in 演算子を使用して、タプル内に特定の要素が含まれているかを確認できる。
t = ("Python", "JavaScript", "Swift")
print("Python" in t)
print("Java" in t)
print("Java" not in t)
# 出力 True False True
タプルのアンパッキング
タプルを使用すれば、複数の変数に1文で値を渡すことができる。
以下の例では、3つの値を持ったタプルと3つの変数を用意して、タプルを代入している。
変数のそれぞれの位置とタプルの値が対応しているのが分かる。(これをタプルのアンパックと呼ぶ)
いくつでも対応させることができるが、変数が多くなると可読性が落ちる。
lang = ("Python", "JavaScript", "Swift")
Py, JS, Sw = lang
print(Py)
print(JS)
print(Sw)
# 出力 Python JavaScript Swift
アスタリスクを使用したアンパッキング
アスタリスク * を変数の前に付けることで、残りの要素をリストとして受け取ることができる。
t = (1, 2, 3, 4, 5)
first, *rest = t
print(first)
print(rest)
*start, last = t
print(start)
print(last)
first, *middle, last = t
print(first)
print(middle)
print(last)
# 出力 1 [2, 3, 4, 5] [1, 2, 3, 4] 5 1 [2, 3, 4] 5
変数の値の交換
タプルのアンパッキングを利用して、変数の値を簡単に交換することができる。
a = 10
b = 20
a, b = b, a
print(a)
print(b)
# 出力 20 10
関数の戻り値としてのタプル
関数から複数の値を返す場合、タプルがよく使用される。
def get_min_max(numbers):
return min(numbers), max(numbers)
result = get_min_max([3, 1, 4, 1, 5, 9, 2, 6])
print(result)
min_val, max_val = get_min_max([3, 1, 4, 1, 5, 9, 2, 6])
print(min_val)
print(max_val)
# 出力 (1, 9) 1 9
タプルの比較
タプルは辞書順 (レキシコグラフィック順序) で比較される。
最初の要素から順に比較し、異なる要素が見つかった時点で比較結果が決まる。
print((1, 2, 3) < (1, 2, 4))
print((1, 2, 3) < (1, 3, 2))
print((1, 2) < (1, 2, 0))
print((1, 2, 3) == (1, 2, 3))
# 出力 True True True True
辞書のキーとしてのタプル
タプルはイミュータブル (不変) であるため、ハッシュ可能である。
これにより、タプルは辞書のキーや集合の要素として使用することができる。
リストはミュータブルであるため、辞書のキーとして使用できない。
# タプルを辞書のキーとして使用
location = {
(35.6762, 139.6503): "Tokyo",
(40.7128, -74.0060): "New York",
(51.5074, -0.1278): "London"
}
print(location[(35.6762, 139.6503)])
# 出力 Tokyo
複数のキーを組み合わせて辞書にアクセスする場合にも便利である。
# 複合キーとしての使用例
sales = {
("2024", "Q1"): 1000,
("2024", "Q2"): 1500,
("2024", "Q3"): 1200,
("2024", "Q4"): 1800
}
print(sales["2024", "Q2"]) # 丸括弧は省略可能
# 出力 1500
ただし、タプルの要素にリスト等のミュータブルなオブジェクトが含まれている場合は、ハッシュ可能ではなくなるため、辞書のキーとして使用できない。
# タプルの要素にリストが含まれている場合
t = ([1, 2], [3, 4])
# d = {t: "value"} # TypeError: unhashable type: 'list'
名前付きタプル (namedtuple)
collections モジュールの namedtuple を使用すると、フィールド名でアクセスできるタプルを作成することができる。
通常のタプルはインデックスでしか要素にアクセスできないが、名前付きタプルは属性名でアクセスできるため、コードの可読性が向上する。
基本的な使い方
from collections import namedtuple
# 名前付きタプルの定義
Point = namedtuple('Point', ['x', 'y'])
# インスタンスの作成
p = Point(10, 20)
# フィールド名でアクセス
print(p.x)
print(p.y)
# インデックスでもアクセス可能
print(p[0])
print(p[1])
# 出力 10 20 10 20
フィールド名の指定方法
フィールド名は、リスト、タプル、またはスペース区切りの文字列で指定できる。
from collections import namedtuple
# リストで指定
Point1 = namedtuple('Point1', ['x', 'y'])
# タプルで指定
Point2 = namedtuple('Point2', ('x', 'y'))
# スペース区切りの文字列で指定
Point3 = namedtuple('Point3', 'x y')
# カンマ区切りの文字列で指定
Point4 = namedtuple('Point4', 'x, y')
名前付きタプルのメソッド
名前付きタプルには、いくつかの便利なメソッドがある。
_asdict メソッドは、名前付きタプルを辞書として返す。
from collections import namedtuple
Person = namedtuple('Person', ['name', 'age', 'city'])
p = Person('Alice', 30, 'Tokyo')
print(p._asdict())
# 出力
{'name': 'Alice', 'age': 30, 'city': 'Tokyo'}
_replace メソッドは、指定したフィールドの値を置き換えた新しい名前付きタプルを返す。(元のタプルは変更されない)
from collections import namedtuple
Person = namedtuple('Person', ['name', 'age', 'city'])
p1 = Person('Alice', 30, 'Tokyo')
p2 = p1._replace(age=31)
print(p1)
print(p2)
# 出力 Person(name='Alice', age=30, city='Tokyo') Person(name='Alice', age=31, city='Tokyo')
_fields 属性は、フィールド名のタプルを返す。
from collections import namedtuple
Person = namedtuple('Person', ['name', 'age', 'city'])
print(Person._fields)
# 出力
('name', 'age', 'city')
typing.NamedTupleを使用した型ヒント付きの名前付きタプル
Python 3.6以降では、typing.NamedTuple を使用して、型ヒント付きの名前付きタプルを定義できる。
from typing import NamedTuple
class Point(NamedTuple):
x: float
y: float
label: str = "origin" # デフォルト値を設定可能
p = Point(1.0, 2.0)
print(p)
print(p.label)
# 出力 Point(x=1.0, y=2.0, label='origin') origin
タプルとリストの使い分け
タプルとリストは似ているが、それぞれ適した用途がある。
| 特徴 | タプル | リスト |
|---|---|---|
| 変更可能性 | イミュータブル (変更不可) | ミュータブル (変更可能) |
| メモリ効率 | より効率的 | やや非効率 |
| 辞書のキー | 使用可能 | 使用不可 |
| 用途 | 固定データ、座標、レコード | 動的なコレクション |
タプルを使用すべき場面
- データが変更されるべきではない場合
- 辞書のキーや集合の要素として使用する場合
- 関数から複数の値を返す場合
- メモリ効率が重要な場合
リストを使用すべき場面
- データの追加、削除、変更が必要な場合
- 同種のデータのコレクションを扱う場合
- 順序付きのデータを動的に操作する場合