Pythonのタプルを徹底解説!意外と知られてない便利な機能についても解説。

はじめに

1.1 タプルとは何か

Pythonのタプル(tuple)は、複数の要素をカンマで区切って並べた不変のシーケンス型です。リスト(list)と同様に、複数の要素を格納することができますが、一度作成されたタプルの要素は変更することができません。この不変性が、タプルが利用されるケースによっては非常に有用となります。

1.2 タプルの使い道

タプルは、リストと同様に複数の要素を格納することができますが、リストとは異なる特徴を持ちます。具体的には、以下のような使い道があります。

  • 要素を変更しないで保持したい場合
  • 複数の戻り値を持つ関数の戻り値として利用する場合
  • 辞書型のキーとして利用する場合
  • 要素の順序を保持したまま複数の値を一度に扱いたい場合

タプルの基本的な操作方法

2.1 タプルの作成方法

2.1.1 普通のタプルの作成方法

タプルは、小括弧(())で要素を囲んで作成することができます。以下は、タプルを作成する基本的な方法です。

# タプルの作成方法1
t1 = (1, 2, 3)
print(t1)  # (1, 2, 3)

# タプルの作成方法2
t2 = 4, 5, 6
print(t2)  # (4, 5, 6)

2.1.2 括弧を省略する方法

タプルは、カンマで区切った複数の要素を並べることでも作成することができます。この場合、小括弧を省略することができます。

# タプルの作成方法3
t3 = 7, 8, 9
print(t3)  # (7, 8, 9)

2.2 タプルの要素のアクセス方法

2.2.1 インデックスを指定して要素にアクセスする方法

タプルの要素には、リストと同様にインデックスを指定してアクセスすることができます。ただし、タプルは不変であるため、要素の値を変更することはできません。

2.1.2 括弧を省略する方法

タプルは、カンマで区切った複数の要素を並べることでも作成することができます。この場合、小括弧を省略することができます。

# タプルの作成方法3
t3 = 7, 8, 9
print(t3)  # (7, 8, 9)

2.2 タプルの要素のアクセス方法

2.2.1 インデックスを指定して要素にアクセスする方法

タプルの要素には、リストと同様にインデックスを指定してアクセスすることができます。ただし、タプルは不変であるため、要素の値を変更することはできません。

t = (1, 2, 3, 4, 5)
print(t[0])  # 1
print(t[3])  # 4

2.2.2 スライスを使って範囲指定で要素にアクセスする方法

スライスを使うことで、タプルの中の複数の要素を一度に取り出すことができます。

t = (1, 2, 3, 4, 5)
print(t[1:4])  # (2, 3, 4)

2.2.3 ネストされたタプルの要素にアクセスする方法

タプルの要素として、別のタプルを含めることができます。この場合、ネストされたタプルの要素には、インデックスを複数指定することでアクセスすることができます。

t = (1, (2, 3), 4)
print(t[1])      # (2, 3)
print(t[1][0])   # 2

2.3 タプルの基本的な操作方法

2.3.1 len()関数を使ってタプルの要素数を取得する方法

タプルの要素数を取得するには

、組み込み関数であるlen()関数を使います。

t = (1, 2, 3, 4, 5)
print(len(t))  # 5

2.3.2 +演算子を使ってタプルを結合する方法

+演算子を使うことで、複数のタプルを結合することができます。

t1 = (1, 2, 3)
t2 = (4, 5, 6)
t3 = t1 + t2
print(t3)  # (1, 2, 3, 4, 5, 6)

2.3.3 *演算子を使ってタプルを繰り返す方法

*演算子を使うことで、タプルを指定した回数繰り返すことができます。

t = (1, 2, 3)
print(t * 3)  # (1, 2, 3, 1, 2, 3, 1, 2, 3)

2.3.4 in演算子を使ってタプルに要素が含まれているか確認する方法

in演算子を使うことで、タプルに指定した要素が含まれているかどうかを確認することができます。

t = (1, 2, 3, 4, 5)
print(2 in t)  # True
print(6 in t)  # False

タプルの高度な操作方法

3.1 sorted()関数を使ってタプルの要素をソートする方法

sorted()関数を使うことで、タプルの要素をソートすることができます。

t = (3, 2, 1, 5, 4)
sorted_t = sorted(t)
print(sorted_t)  # [1, 2, 3, 4, 5]

3.2 enumerate()関数を使ってタプルの要素にインデックスを付ける方法

enumerate()関数を使うことで、タプルの要素に対してインデックスを付けることができます。

t = (1, 2, 3)
for i, value in enumerate(t):
    print(i, value)

実行結果:

0 1
1 2
2 3

3.3 zip()関数を使って複数のタプルを組み合わせる方法

zip()関数を使うことで、複数のタプルを組み合わせることが

できます。

t1 = (1, 2, 3)
t2 = ('a', 'b', 'c')
zipped_t = zip(t1, t2)
print(list(zipped_t))  # [(1, 'a'), (2, 'b'), (3, 'c')]

3.4 namedtuplesを使った名前付きタプルの作成方法

namedtupleは、通常のタプルにフィールド名を付けることができます。これにより、タプルの要素に対して意味を持たせることができます。

from collections import namedtuple

Person = namedtuple('Person', ['name', 'age'])
person = Person('Alice', 25)
print(person.name)  # Alice
print(person.age)   # 25

3.5 タプル内包表記

内包表記を使うことで、リストと同様にタプルを簡潔に作成することができます。

t = tuple(i for i in range(10) if i % 2 == 0)
print(t)  # (0, 2, 4, 6, 8)

タプルとリストの比較

4.1 タプルとリストの違い

タプルとリストの違いは、以下の通りです。

  • タプルは不変であるが、リストは可変である。
  • タプルはカンマ区切りの要素を小括弧で囲んで作成し、リストは角括弧で囲んで作成する。
  • タプルは要素の変更ができないため、ソートや結合などの操作を行う場合は新しいタプルが作成される。

複数の値をdictのキーにしたい場合はtuple使用する

タプルは不変であるため、dictのキーとして使用することができます。以下は、タプルをキーとするdictの例です。

d = {('Alice', 25): 'female', ('Bob', 30): 'male'}
print(d[('Alice', 25)])  # female

リストをdictのキーにはできない

リストだとエラーが発生します。

d = {['Alice', 25]: 'female', ['Bob', 30]: 'male'}# 動作しません。

上記のコードを実行すると、以下のようなTypeErrorが発生します。

pythonCopy codeTypeError: unhashable type: 'list'

これは、リストが可変(mutable)であるため、辞書のキーとして使用することができないためです。一方で、タプルは不変(immutable)であるため、辞書のキーとして使用することができます。

4.2 タプルとリストの使い分け

タプルとリストは、以下のように使い分けます。

  • 複数の値をまとめて返す場合は、タプルを使用する。
  • データを追加、削除する必要がある場合は、リストを使用する。
  • プログラムのパフォーマンスが重要な場合は、タプルを使用する。
  • dictのキーに複数の値を使いたい場合はタプル雨を使用する。

ジェネレーター関数によるタプルの利用

5.1 ジェネレーター関数の概要

ジェネレーター関数は、yield文を含む関数のことで、イテレータを返します。イテレータとは、for文で反復処理を行うことができるオブジェクトのことです。

5.2 ジェネレーター関数でタプルを返す方法

ジェネレーター関数からタプルを返す場合は、yield文を使います。

def gen_t():
    yield (1, 2, 3)

g = gen_t()
print(next(g))  # (1, 2, 3)

5.3 yield from文を使ったタプルの展開

yield from文を使うことで、ジェネレーター関数から返されたタプルを展開することができます。

def gen_t():
    yield from (1, 2, 3)

g = gen_t()
for i in g:
    print(i)

実行結果:

1
2
3

タプルに関するベストプラクティス

以下は、タプルに対するベストプラクティスです。

6.1.1 変更する必要のないデータにタプルを使用する

タプルは不変であるため、データを変更する必要がない場合に使用すると良いでしょう。

6.1.2 複数の戻り値を持つ関数の戻り値として利用する

タプルは複数の要素を一度に返すことができるため、複数の戻り値を持つ関数の戻り値として使用すると便利です。

6.1.3 複数の変数を同時にアンパックする

タプルは複数の要素を持つことができるため、複数の変数を同時にアンパックすることができます。

t = (1, 2, 3)
a, b, c = t

6.1.4 namedtuplesを使って可読性の高いコードを書く

namedtupleを使うことで、タプルの要素に意味を持たせることができます。

6.2 タプルのパフォーマンスに関する注意点

タプルはリストに比べて不変であるため、パフォーマンスが良いとされています。

まとめ

本記事では、Pythonのタプルについて解説しました。タプルの基本的な操作方法や高度な操作方法、タプルとリストの使い分け、ジェネレーター関数によるタプルの利用、タプルに関するベストプラクティス、タプルをdictのキーとして使用する方法について解説しました。タプルは不変であるため、データを変更する必要がない場合に使用すると良いでしょう。

コメント

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