このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】タプルにインデックスとスライスを指定する

タプルにインデックスとスライスを指定する

 タプルはリストや文字列と同様にシーケンス型であり、インデックスやスライスを利用して個々の要素に簡単にアクセスできます。ここでは、タプルに対してどのようにインデックスやスライスを指定するか、またその結果得られる部分集合について、具体例や表を交えながら詳しく解説します。なお、タプルは不変(イミュータブル)であるため、取得した要素を変更することはできません。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.タプルのインデックス指定

 タプルの各要素には、正の数や負の数のインデックスを用いてアクセスすることが可能です。ここでは、書籍の情報をまとめたタプルを例に、インデックス指定の基本と負のインデックスの利用方法を示します。

1.1. 正のインデックスによる要素の取得

 まずは、タイトル、価格、ページ数を表すタプルを作成し、正のインデックスで各要素を取り出す例です。

サンプルプログラム

# 書籍のタイトル、価格、ページ数をまとめたタプルを作成
book = ('Python基礎', 45, 320)

# タプル全体を表示
print("書籍タプル:", book)
# 出力例: 書籍タプル: ('Python基礎', 45, 320)

# 正のインデックスを使って各要素を取得
title = book[0]     # 0番目はタイトル
price = book[1]     # 1番目は価格
pages = book[2]     # 2番目はページ数

print("タイトル:", title)   # 出力例: タイトル: Python基礎
print("価格:", price)       # 出力例: 価格: 45
print("ページ数:", pages)   # 出力例: ページ数: 320

実行結果

書籍タプル: ('Python基礎', 45, 320)
タイトル: Python基礎
価格: 45
ページ数: 320

解説

  • タプルbookは丸括弧内に要素をカンマで区切って定義しています。
  • インデックス012を用いることで、それぞれタイトル、価格、ページ数を取り出しています。

1.2. 負のインデックスによる要素の取得と注意点

 負のインデックスを利用すると、タプルの末尾から数えて要素にアクセスできます。以下の例では、同じbookタプルから負のインデックスを使って要素を取得しています。また、タプルはイミュータブルであるため、インデックス指定による要素の変更は許されません。

サンプルプログラム

# 負のインデックスで要素にアクセス
print("最後の要素(負のインデックス-1):", book[-1])   # 出力例: 320
print("2番目の要素(負のインデックス-2):", book[-2])  # 出力例: 45
print("最初の要素(負のインデックス-3):", book[-3])   # 出力例: Python基礎

# タプルの変更はできない例(コメントアウト)
# book[1] = 40  ← このような代入はTypeErrorを引き起こします

# 実際に変更を試みた場合のエラー例
try:
    book[1] = 40
except TypeError as e:
    print("エラー:", e)
# 出力例: エラー: 'tuple' object does not support item assignment

実行結果

最後の要素(負のインデックス-1): 320
2番目の要素(負のインデックス-2): 45
最初の要素(負のインデックス-3): Python基礎
エラー: 'tuple' object does not support item assignment

解説

  • 負のインデックス-1は最後の要素、-2は末尾から2番目、-3は先頭の要素と同じ値になります。
  • タプルは作成後に変更できないため、要素への代入操作はエラーとなり、プログラムの安全性が保たれています。

下記の表は、正のインデックスと負のインデックスで取得される要素の対応を示しています。

インデックス指定説明取得される要素
book[0]先頭から0番目(最初の要素)'Python基礎'
book[1]先頭から1番目45
book[2]先頭から2番目(最後の要素)320
book[-1]末尾から1番目(最後の要素)320
book[-2]末尾から2番目45
book[-3]末尾から3番目(最初の要素)'Python基礎'

2.タプルのスライス利用

 インデックスだけでなく、タプルではスライスを用いて複数の要素を一度に取得することができます。ここでは、開始位置と終了位置を指定する基本的なスライスの例と、ストライド(間隔)を指定した応用例を紹介します。

2.1. 基本的なスライスによる部分タプルの抽出

書籍情報タプルから、タイトルと価格のみ、または価格とページ数のみを取り出す例です。

サンプルプログラム

# 書籍タプルの再利用
print("書籍タプル:", book)
# 出力例: 書籍タプル: ('Python基礎', 45, 320)

# スライスを用いて、タイトルと価格を取得
title_and_price = book[:2]
print("タイトルと価格:", title_and_price)
# 出力例: タイトルと価格: ('Python基礎', 45)

# スライスを用いて、価格とページ数を取得
price_and_pages = book[1:]
print("価格とページ数:", price_and_pages)
# 出力例: 価格とページ数: (45, 320)

実行結果

書籍タプル: ('Python基礎', 45, 320)
タイトルと価格: ('Python基礎', 45)
価格とページ数: (45, 320)

解説

  • book[:2]は、開始インデックスを省略して0から2未満までの要素、すなわちタイトルと価格を取り出します。
  • book[1:]は、1番目以降の全要素を取得するため、価格とページ数が得られます。

2.2. ストライドを用いたスライスの応用例

 ストライド(step)を指定すると、一定間隔ごとの要素を抽出できます。ここでは、連続する整数を格納したタプルを例に、2個おきの要素を取り出す方法を示します。

サンプルプログラム

# 1から10までの整数を持つタプルを作成
numbers = tuple(range(1, 11))
print("整数タプル:", numbers)
# 出力例: 整数タプル: (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

# スライスで2個おきに要素を抽出
every_second = numbers[::2]
print("2個おきの要素:", every_second)
# 出力例: 2個おきの要素: (1, 3, 5, 7, 9)

# また、逆順に取得する例
reverse_order = numbers[::-1]
print("逆順の要素:", reverse_order)
# 出力例: 逆順の要素: (10, 9, 8, 7, 6, 5, 4, 3, 2, 1)

実行結果

整数タプル: (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
2個おきの要素: (1, 3, 5, 7, 9)
逆順の要素: (10, 9, 8, 7, 6, 5, 4, 3, 2, 1)

解説

  • numbers[::2]では、開始位置と終了位置を省略し、ストライドを2に設定することで、タプルの先頭から2つおきの要素を抽出しています。
  • numbers[::-1]は、ストライドに-1を指定することでタプルの要素を逆順に並べ替えています。

下記の表は、スライス指定のパターンとその効果をまとめたものです。

スライス記法取得される要素説明
tuple[:2]先頭から2つの要素タプルの最初の部分を取得
tuple[1:]2番目以降の全ての要素タプルの後半部分を取得
tuple[::2]先頭から2個おきの要素一定間隔で要素を抽出
tuple[::-1]タプル内の全要素が逆順要素の順序を反転

まとめ

 タプルは不変のシーケンス型であり、インデックスやスライスを活用して必要な要素や部分集合を簡単に取得することができます。

  • インデックス指定では、正の値や負の値を用いて個々の要素にアクセス可能です。
  • スライス指定を利用することで、連続した複数の要素をまとめて抽出でき、さらにストライドを指定することで間隔を調整した抽出も行えます。
  • タプルはイミュータブルなため、取得した要素の変更はできず、要素の更新が必要な場合は新たなタプルを作成する必要があります。

次のステップでは、タプルのパッキングとアンパッキングについて詳しく解説していきます。