基本データを組み合わせて、より複雑な構造のデータを作成するには以下のものが使える。
これらのうち、リスト、タプルは「シーケンス型」に分類される。シーケンス型は順序を持った要素の集合を表す(実際には、シーケンス型に分類されるデータ型としては文字列、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以外の場合は、スライスと代入するリストの要素数が等しくなければならない)。
リストは変更可能なオブジェクトであり、以下のような操作が行える。
以下に例を幾つか示す。
>>> 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.