特集
» 2016年10月03日 05時00分 公開

特集:Visual Studioで始めるPythonプログラミング:Pythonの文法、基礎の基礎 (2/4)

[かわさきしんじ,Insider.NET編集部]

リストとタプル

 基本データを組み合わせて、より複雑な構造のデータを作成するには以下のものが使える。

  • リスト: 任意の型のデータを要素とするデータ構造。[]で囲んで記述する。変更可能
  • タプル: 任意の型のデータを要素とするデータ構造。()で囲んで記述する。変更不可能
  • 辞書: いわゆる連想配列。{}で囲んで記述する。変更可能
  • 集合: 順序を持たない要素のコレクション。集合には1つの要素を重複して格納することはできない。変更可能な集合と、変更不可能なfrozensetがある
  • クラス: 属性とメソッドで構成されるユーザー定義型
  • モジュール: 関連ある関数や変数、クラスなどを含む

 これらのうち、リスト、タプルは「シーケンス型」に分類される。シーケンス型は順序を持った要素の集合を表す(実際には、シーケンス型に分類されるデータ型としては文字列、bytes型、bytearray型なども存在する)。

 これらのうち、以下ではリスト、タプル、辞書、集合について見てみよう。

リスト

 リストは、さまざまな型のデータを要素とし、それらを[]の中にカンマで区切って並べていく。実体はlistクラスのインスタンスとなる。以下に例を示す。

>>> lst = [5, 7, 2, 9, 3] # リストの作成
>>> type(lst)   # リストはlistクラスのインスタンス
<class 'list'>
>>> lst[4]      # インデックス指定
3
>>> lst[0:4]    # リストのスライス
[5, 7, 2, 9]
>>> lst[0:4:2]  # リストのスライス(インデックス0〜3の要素を1つ飛ばしで)
[5, 2]
>>> lst[-1]     # インデックスに負数を指定すると末尾からアクセス可能
3
>>> lst[0:2] = [4, 6]    # スライスされた範囲の書き換え
>>> lst
[4, 6, 2, 9, 3]
>>> lst[0:2] = [5, 7, 1]  # この例では左辺と右辺の要素数が違っていてもOK
>>> lst
[5, 7, 1, 2, 9, 3]
>>> sorted(lst)     # sorted関数はリストをソートしたもののコピーを返す
[1, 2, 3, 5, 7, 9]
>>> lst             # 元のリストは変化していない
[5, 7, 1, 2, 9, 3]
>>> lst.sort()      # listクラスのsortメソッドはリストを並べ替える(破壊的変更)
>>> lst
[1, 2, 3, 5, 7, 9]


リストの使用例

 上のコードで定義しているリストでは、要素は全て整数値となっているが、複数の型のオブジェクトを要素にまとめることも可能だ。リストの要素は「lst[4]」のようにインデックスを指定して取り出したり、その値を変更したりできる。

 「lst[0:4]」は「スライス」表記と呼び、リスト内の指定した要素を取り出すものだ(スライスは指定された範囲の浅いコピーを返送する)。このときには、[]内に「開始インデックス、終了インデックス、差分」を順に記述していく。ただし、終了インデックスで指定される要素はスライス操作の対象にはならないことに注意(終了インデックスで指定される要素の直前の要素までがスライスに含まれる)。代入文の左辺に置けば、それらを置き換えることもできる(差分が1以外の場合は、スライスと代入するリストの要素数が等しくなければならない)。

 リストは変更可能なオブジェクトであり、以下のような操作が行える。

  • 要素の追加: append/extendメソッドによるリスト末尾への要素の追加
  • 要素の挿入: insertメソッドによるリスト中の指定した箇所への要素の挿入
  • 要素の削除: removeメソッドで指定した値を持つ最初(インデックスが最小)の要素を削除
  • 要素のポップ: popメソッドによる指定したインデックス位置の要素の取得とリストからの削除(インデックスを指定しなければ、末尾の要素が対象となる。このため、append/popメソッドを使うことで、リストをスタックとして扱える)
  • 全要素の削除: clearメソッドによるリストの全要素の削除
  • 要素の検索: indexメソッドで指定した値を持つ最初(インデックスが最小)の要素を取得
  • 要素の数え上げ: countメソッドで指定した値がリスト中に何個あるかを計算
  • リストの並べ替え: sortメソッドによるリストのソート。上で見た通り、リスト自身を書き換える。書き換えをせずに、並べ替えた結果のコピーを取得するには組み込みのsorted関数を使用する
  • リストの逆順化: reverseメソッドによるリストの要素の逆順化(破壊的操作)
  • リストのコピー: copyメソッドまたはスライスによるリストの浅いコピーの取得

 以下に例を幾つか示す。

>>> lst = [1, 2, 3]
>>> lst.append(4)  # appendメソッドによる要素追加
>>> lst
[1, 2, 3, 4]
>>> lst.extend([5, 6])  # extendメソッドによる要素追加
>>> lst
[1, 2, 3, 4, 5, 6]
>>> lst.extend((7,8))   # extendメソッドにはタプルなど反復可能なオブジェクトを渡せる
>>> lst
[1, 2, 3, 4, 5, 6, 7, 8]
>>> lst += [9]          # 単一要素からなるリストの加算代入
>>> lst
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> lst += 10           # リストに整数を加算と解釈されるのでエラーになる
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
>>> lst.remove(6)       # リスト中の最初の「6」を削除
>>> lst
[1, 2, 3, 4, 5, 7, 8, 9]
>>> lst.insert(5, 6)    # インデックス5の位置に要素「6」を挿入
>>> lst
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> lst.index(5)        # 要素「5」のインデックスを取得
4
>>> lst.append(1)
>>> lst
[1, 2, 3, 4, 5, 6, 7, 8, 9, 1]
>>> lst.count(1)        # 要素「1」の出現回数を取得
2
>>> lst.pop()           # 末尾の要素をポップ
1
>>> lst
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> lst.reverse()       # リストを逆順に並べ替える
>>> lst
[9, 8, 7, 6, 5, 4, 3, 2, 1]


リストの操作

 ここでは示さなかったが、特定要素またはリスト全体の削除にはdel文も利用できる。

タプル

 タプルはリストと同様だが、[]ではなく、()の中にその要素をカンマで区切って並べていく(実際には()はなくても構わない)。以下に例を示す。

>>> tpl = (5, 7, 2, 9, 3)  # タプルの作成
>>> type(tpl)   # タプルはtupleクラスのインスタンス
<class 'tuple'>
>>> tpl = 5, 7, 2, 9, 3    # かっこがなくてもよい
>>> tpl
(5, 7, 2, 9, 3)
>>> tpl[4]      # インデックスによるアクセス
3
>>> tpl[0:4]    # タプルのスライス
(5, 7, 2, 9)
>>> tpl[0:4:2]  # タプルのスライス(インデックス0〜3の要素を1つ飛ばしで)
(5, 2)
>>> tpl[-1]     # インデックスに負数を指定
3
>>> tpl[0:2] = (4, 6)  # タプルは変更不可能
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> sorted(tpl) # sorted関数によるタプルの要素の並べ替え
[2, 3, 5, 7, 9]
>>> type((1))   # 要素を1つだけかっこで囲んだ場合にはタプルにはならない
<class 'int'>
>>> type((1,))  # その場合は末尾にカンマを付加する
<class 'tuple'>


タプルの使用例

 リストとタプルの大きな違いは前者が変更可能(ミュータブル)であるのに対して、後者は変更不可能(イミュータブル)であることだ。そのため、上の例で示したように、タプルではその要素への代入はサポートされていない。ただし、次のようにタプルの要素にリストを含めることは可能だ。この場合、リストは変更可能なので、その要素を変更できる。

>>> lst2 = [1, 2, 3]
>>> lst3 = [4, 5, 6]
>>> tpl2 = (lst2, lst3)
>>> tpl2[0][1] = 4  # タプルの要素であるリストの要素を変更
>>> tpl2
([1, 4, 3], [4, 5, 6])
>>> tpl[0] = [7, 8, 9]  # タプル自体は変更不可能なので、その要素に代入はできない
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment


リストを要素とするタプル

 また、上で見たようなリストでサポートされている破壊的操作(メソッド)もタプルには提供されていない。例えば、リストの例で見たsortメソッドはタプルにはない。タプル(tupleクラス)でサポートされているメソッドは、指定した値の出現回数を数え上げるcountメソッドと指定した値を持つ最初の要素のインデックスを取得するindexメソッドのみである。

 少々長くなったので、辞書と集合については次ページで見ていこう。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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