連載
» 2019年06月14日 05時00分 公開

Python入門:[Python入門]タプル (1/3)

リストとよく似ているが、変更不可能という大きな特徴を持つ「タプル」の基本、その操作、リストとの違いなどについて説明する。

[かわさきしんじ,Deep Insider編集部]
「Python入門」のインデックス

連載目次

 前回まで3回に分けてPythonのリストを取り上げてきた。今回はリストと似たデータ構造である「タプル」について見ていこう。

タプルとは

 冒頭でも述べたが、タプルはリストとよく似ている。リストは角かっこ「[]」の中にカンマ区切りで要素を並べて表記したが、タプルでは角かっこの代わりにかっこ「()」を使う。その要素をカンマで区切って並べるのはリストと同様だ。

タプル タプル

 以下に例を示す。

sk = ('shinji', 'kawasaki', 80)
print(sk)

タプルの定義例(1)

 これを実行すると、次のような表示となる。

実行結果 実行結果

 先ほどのコードの1行目では上で述べた通り、かっこ「()」中にカンマ区切りで要素を並べることでタプルを作成している。2行目ではそれを表示しているだけだが、タプルの表現も同様な形式になっていることが分かるはずだ(後述するが、タプル作成時にはかっこ「()」は省略可能)。

 このように見た目はリストとよく似ているが、タプルには「その要素を変更できない」という特徴があり、これがリストとの大きな違いとなっている。

 なお、「変更できない」ことを「イミュータブル」(immutable)と、「変更できる」ことを「ミュータブル」(mutable)と呼ぶことがある。リストは「ミュータブルなオブジェクト」であり、タプルは「イミュータブルなオブジェクト」だ。

タプルの定義

 先ほどの例では、かっこ「()」付きでタプルを作成したが、このかっこは省略できる。そのため、実際には次のようにしてもタプルを作成できる。

sk = 'shinji', 'kawasaki', 80
print(sk)

タプルの定義例(2)

 なお、空のタプルを作成する際にはかっこ「()」は省略できない。

emptytuple = ()  # 空のタプルの作成
print(type(emptytuple))  # emptytupleの型を調べてみる

空のタプルの作成

 要素が1つだけのタプルも作成できる。ただし、単純にかっこ「()」で囲むだけではダメだ。

oneitem_tuple = ('Python'# 1要素のタプル?
print(oneitem_tuple)
print(type(oneitem_tuple))  # oneitem_tupleの型を調べてみる

1つの要素だけで構成されるタプルの作成?

 これを実行した結果が以下だ(空のタプルの作成例も同時に示しておく)。

変数oneitem_tupleにはタプルではなく、文字列が代入されている 変数oneitem_tupleにはタプルではなく、文字列が代入されている

 要素が1つだけのタプルを作成したつもりだったが、その実行結果を見ると、最初の出力にはタプルを囲むかっこがない。また、2行目の出力は「<class 'str'>」となっている。その上の空のタプルの作成例では、タプルの型として「<class 'tuple'>」と表示されているのとは異なる結果だ。これは変数oneitem_tupleに文字列(str型)が代入されているということだ。つまり、これは文字列であって、タプルではない。

 かっこ「()」は計算式における演算の優先順位の指定や関数呼び出しなどでも使われるため、「かっこで1つの要素を囲むだけでは、タプルの作成とは見なされない」ことが、こうなった理由だ。1要素で構成されるタプルを作成するには「カンマ(,)を要素の後に置く」のが常道だ(かっこはあってもなくても構わない)。

# どちらの方法でもよい
oneitem_tuple = ('Python',)
print(oneitem_tuple)

oneitem_tuple = 'Python',
print(oneitem_tuple)

1要素からなるタプルを作成するには末尾にカンマが必要

 実行結果を以下に示す。

実行結果 実行結果

 こちらの方法では、print関数による出力結果を見ると、かっこで要素'Python'が囲まれると同時に、最後にカンマが含まれている。これが要素が1つしかないタプルだ。

 リストの作成にlist関数が使えたように、tuple関数を使ってもタプルを作成できる。

tuple関数

tuple(iterabl)


 引数に指定したiterableを基にタプルを作成する。

パラメーター 説明
iterable タプルの作成に利用する反復可能オブジェクト(省略可能)。作成されるタプルの要素はiterableの要素と同じものになる。省略した場合は空のタプルが作成される
tuple関数のパラメーター


 以下に例を示す(実行結果は省略)。

emptytuple = tuple()  # 空のタプルを作成
mylist = [0, 1, 2, 3
mytuple = tuple(mylist)  # リストを基にタプルを作成
anothertuple = tuple(iter(mylist))  # イテレータを基にタプルを作成
print(mytuple)
print(anothertuple)

tuple関数の使用例

タプルの要素の取り出し

 タプルの要素には、リスト同様、「[インデックス番号]」を付加してアクセスできる。

print(sk[0])

タプルの要素へのアクセス

 ただし、リストとは異なり、タプルは変更不可能であるため、タプルの要素への代入はできない。

sk[1] = 'okazaki'

タプルの要素を変更できない

 例えば、上のコードを実行すると、次のようにエラーが発生する。

タプルの要素への代入はサポートされていない タプルの要素への代入はサポートされていない

 エラーメッセージの内容を見ると、「タプルオブジェクトでは、要素への代入はサポートされていない」となっている。

 要素の変更が不可能なことを除けば(要素の削除ももちろん不可能)、タプルはリストと似た扱いができる。for文と組み合わせることも可能だ。以下に例を示す(予想通りの実行結果となるので、実行画面は割愛する)。

for item in sk:
    print(item)

タプルの要素も反復可能

 文字列やリストと同様にスライス操作によって、タプルの特定の範囲にある要素を取り出すことも可能だ。スライスの詳細については第6回「Pythonの文字列の操作」の「文字列から指定した範囲の要素(部分文字列)を取得する:スライス」や、第16回「リストの基本」の「リストの要素のスライス」を参照されたい。

       1|2|3 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。