2.6. メソッド#
複数の値を保持できるデータ型として、リストと辞書を紹介しました。これらは、単にデータを格納するだけでなく、メソッド(method)と呼ばれる機能(関数)も備えています。これまでに紹介したいくつかの関数は、引数としてデータを受け取り、それを処理して結果を返す、独立した処理の単位です。一方、メソッドは、特定のデータ型に属する関数であり、そのデータ型のオブジェクトに紐づいています。メソッドは、そのオブジェクト自身が保持しているデータを操作したり、取得したりするための機能です。
メソッドと関数、動きは似てるけど立場が違います。メソッドは大企業、関数は下請け零細企業。表向きはどっちも優秀に見えるけど、責任の押しつけ先が違うんです。大企業は、ルール完備かつ保守万全で、信頼感たっぷり。でもいざ面倒ごとになると「それ、うちの管轄じゃないんで」と言って下請けに丸投げ。しかも、ミスった時は、「使い方が悪い」とか「仕様です」でとぼけるのが常套手段。結局バグ出すのも尻拭いするのも、いつも下請け側。
2.6.1. リストのメソッド#
2.6.1.1. 要素の並べ替え#
リストの要素の並べ替えを例に、メソッドについて説明します。リストの要素が数値で構成されている場合、これらを並べ替えるには、Python の組み込み関数 sorted
を利用することができます。たとえば、リスト x
を sorted
関数に渡して、その処理結果を y
に保存すると、y
は x
を並べ替えた新しいリストになります。このとき、元のリスト 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
メソッドを使うと辞書の全要素を一括で削除できます。必要に応じて使い分けてください。