2.6. メソッド#

複数の値を保持できるデータ型として、リスト辞書を紹介しました。これらは、単にデータを格納するだけでなく、メソッドmethod)と呼ばれる機能(関数)も備えています。これまでに紹介したいくつかの関数は、引数としてデータを受け取り、それを処理して結果を返す、独立した処理の単位です。一方、メソッドは、特定のデータ型に属する関数であり、そのデータ型のオブジェクトに紐づいています。メソッドは、そのオブジェクト自身が保持しているデータを操作したり、取得したりするための機能です。

メソッドと関数、動きは似てるけど立場が違います。メソッドは大企業、関数は下請け零細企業。表向きはどっちも優秀に見えるけど、責任の押しつけ先が違うんです。大企業は、ルール完備かつ保守万全で、信頼感たっぷり。でもいざ面倒ごとになると「それ、うちの管轄じゃないんで」と言って下請けに丸投げ。しかも、ミスった時は、「使い方が悪い」とか「仕様です」でとぼけるのが常套手段。結局バグ出すのも尻拭いするのも、いつも下請け側。

2.6.1. リストのメソッド#

2.6.1.1. 要素の並べ替え#

リストの要素の並べ替えを例に、メソッドについて説明します。リストの要素が数値で構成されている場合、これらを並べ替えるには、Python の組み込み関数 sorted を利用することができます。たとえば、リスト xsorted 関数に渡して、その処理結果を y に保存すると、yx を並べ替えた新しいリストになります。このとき、元のリスト x は変更されません。

x = [2.80, 2.54, 2.28, 2.33, 2.41]
y = sorted(x)
y
[2.28, 2.33, 2.41, 2.54, 2.8]
x
[2.8, 2.54, 2.28, 2.33, 2.41]

一方、メソッドとは、特定のデータ型に固有の関数のことを指します。たとえば、リストには sort メソッドが定義されているため、リスト型で保存されているすべてのオブジェクトはこの sort メソッドを使うことができます。実際に、リスト x に対して sort メソッドを適用してみましょう。

x = [2.80, 2.54, 2.28, 2.33, 2.41]
x.sort()
x
[2.28, 2.33, 2.41, 2.54, 2.8]

このように、x.sort() を実行すると、リスト x の要素が並べ替えられていることが確認できるはずです。つまり、あるオブジェクトに属しているメソッドを使うと、そのオブジェクト自身のデータが変更されます。これがメソッドの特徴です。

なお、要素を降順で並べたい場合は、sort メソッドに reverse=True というオプションを指定します。

x = [2.80, 2.54, 2.28, 2.33, 2.41]
x.sort(reverse=True)
x
[2.8, 2.54, 2.41, 2.33, 2.28]

2.6.1.2. 要素の追加#

一度作成したリストに対して、要素の追加や削除を行うことができます。特に、リストに要素を追加する操作は非常によく使われます。例えば、ファイルの各行からデータを抽出する場合、あらかじめ行数が分からないため、まず空のリストを用意し、1 行ずつ処理しながら抽出した情報をリストに追加する、といった使い方が一般的です。

リストの末尾に要素を1つ追加するには、append メソッドを使用します。

x = [2.80, 2.54, 2.28, 2.33, 2.41]
x.append(2.55)
x
[2.8, 2.54, 2.28, 2.33, 2.41, 2.55]

ただし、append にリストを渡すと、そのリスト全体が一つの要素として追加され、入れ子構造になります。

x = [2.80, 2.54, 2.28, 2.33, 2.41]
x.append([2.55, 2.66, 2.67])
x
[2.8, 2.54, 2.28, 2.33, 2.41, [2.55, 2.66, 2.67]]

複数の要素を個別に追加したい場合は、extend メソッドを使います。

x = [2.80, 2.54, 2.28, 2.33, 2.41]
x.extend([2.55, 2.66, 2.67])
x
[2.8, 2.54, 2.28, 2.33, 2.41, 2.55, 2.66, 2.67]

任意の位置に要素を挿入するには、insert メソッドを使います。第一引数に挿入位置のインデックス、第二引数に挿入する値を指定します。

x = [2.80, 2.54, 2.28, 2.33, 2.41]
x.insert(0, 2.55)
x
[2.55, 2.8, 2.54, 2.28, 2.33, 2.41]
x = [2.80, 2.54, 2.28, 2.33, 2.41]
x.insert(3, 2.66)
x
[2.8, 2.54, 2.28, 2.66, 2.33, 2.41]

2.6.1.3. 要素の削除#

リストから要素を削除するには、pop メソッドを使います。インデックスを指定すると、その位置の要素が削除されます。

x = [2.80, 2.54, 2.28, 2.33, 2.41]
x.pop(2)
x
[2.8, 2.54, 2.33, 2.41]

インデックスを指定しない場合は、末尾の要素が削除されます。

x = [2.80, 2.54, 2.28, 2.33, 2.41]
x.pop(3)
x
[2.8, 2.54, 2.28, 2.41]

プログラムの実行中、特にリストの各要素に対して繰り返し処理をしている最中に、要素の追加や削除を行うと、リストの長さが変化してしまいます。その結果、一部の要素が複数回処理されたり、逆に処理されなかったりする可能性があります。リストの中身を変更しながら処理する際は、コピーして使うなどの工夫が必要です。

2.6.2. 辞書のメソッド#

2.6.2.1. 要素の追加#

辞書に要素を追加するときは、キーを指定して値を代入します。

acorn_weights = {
    'kunugi': 3.45,
    'arakashi': 1.42,
    'shirakashi': 1.73
}
acorn_weights['matebashii'] = 2.78

acorn_weights
{'kunugi': 3.45, 'arakashi': 1.42, 'shirakashi': 1.73, 'matebashii': 2.78}

複数の要素をまとめて追加するときは、update メソッドを使います。このとき、追加したい要素を辞書の形で用意しておく必要があります。

acorn_weights = {
    'kunugi': 3.45,
    'arakashi': 1.42,
    'shirakashi': 1.73
}

new_data = {
    'matebashii': 2.78,
    'konara': 1.63
}

acorn_weights.update(new_data)

acorn_weights
{'kunugi': 3.45,
 'arakashi': 1.42,
 'shirakashi': 1.73,
 'matebashii': 2.78,
 'konara': 1.63}

2.6.2.2. 要素の削除#

辞書から要素を削除するときは、pop メソッドを利用します。削除したい要素のキーを引数として渡します。

acorn_weights = {
    'kunugi': 3.45,
    'arakashi': 1.42,
    'shirakashi': 1.73
}

acorn_weights.pop('kunugi')

acorn_weights
{'arakashi': 1.42, 'shirakashi': 1.73}

なお、popitem メソッドは辞書の最後の要素を削除します。また、clear メソッドを使うと辞書の全要素を一括で削除できます。必要に応じて使い分けてください。