リスト(list)

【Python】リスト(list)の拡張方法 ~extend~

【Python】リスト(list)の拡張方法 _extend_

Pythonのリスト(list)を拡張する方法(extendメソッド)について解説します。

Pythonのリスト(list)を拡張するextendメソッド

Pythonでリストを別のリストを使って拡張する場合には、extendメソッドを使用できます。リストを追加する方法としては、+演算子や*演算子、appendメソッドもあるので、それぞれの違いをしっかり把握しておくことも重要です。

本記事では、extendメソッドの使い方を中心に解説するとともに、+演算子、*演算子、appendメソッドとの違いについて説明していきます。

extendの基本的な使い方

既存リストに新しいリストを追加する方法

既存リストに新しいリストを追加して拡張する場合には、以下例のようにextendメソッドを用いることで簡単に拡張できます。

# listに新しいlistを追加する
data = ["A", "B", "C", "D", "E"]
add_data = ["F", "G", "H"]

print(f"extend実行前 data: {data}, id(data): {id(data)}")
data.extend(add_data)
print(f"extend実行後 data: {data}, id(data): {id(data)}")
【実行結果】
extend実行前 data: ['A', 'B', 'C', 'D', 'E'], id(data): 2249082115904
extend実行後 data: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'], id(data): 2249082115904

※ idの値は実行のたびに変わるため、上記と全く同じ値にはなりません。

上記例の結果を見てみるとextendメソッドによりリストが拡張できていることが分かります。

また、元オブジェクトと異なるかどうか把握するためにid関数を用いてリストのidを確認していますが、dataidには変化がないので既存listdataadd_dataの内容が追加されて拡張されていることが分かります。

extendと+演算子、* 演算子との違い

extendメソッドを使用しない方法として、+演算子や*演算子を使用してリストを拡張することも可能です。以降で例を用いて紹介します。

+演算子を用いたリスト(list)の拡張

+演算子を用いたリストの拡張の使用例について以下に示します。+演算子は、既存リストに新しいリストを追加したい場合に使用することができます。

# +演算子でlistを追加する。
data = ["A", "B", "C", "D", "E"]
add_data = ["F", "G", "H"]

new_data = data + add_data
print(f"data: {data}, id(data): {id(data)}")
print(f"new_data: {new_data}, id(new_data): {id(new_data)}")

# +=を使う場合は、結果としてはextendと同じ
print("===")
print(f"+=実行前 data: {data}, id(data): {id(data)}")
data += add_data
print(f"+=実行後 data: {data}, id(data): {id(data)}")
【実行結果】
data: ['A', 'B', 'C', 'D', 'E'], id(data): 2003474856128
new_data: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'], id(new_data): 2003490920448
===
+=実行前 data: ['A', 'B', 'C', 'D', 'E'], id(data): 2003474856128
+=実行後 data: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'], id(data): 2003474856128

+演算子を用いて別のリストに代入する場合は、別idの新しいリストが生成されます。

一方で、+=演算子を用いてリストを拡張した場合はidが変わっていないことが分かります。このことから、+=演算子を用いる方法とextendメソッドを用いる方法は、同じ結果になるということが分かります。

extend+演算子の違い】

  • +演算子を用いて別変数に入れる場合には、新しいリストが生成される。
  • +=演算子を用いる場合は、元のリストが拡張されるためextendメソッドの結果は同じになる。

*演算子を用いたリスト(list)の拡張

*演算子を用いたリストの拡張の使用例について以下に示します。*演算子は、既存のリストを複数回繰り返したリストを作成したい場合に使用することができます。

# *演算子でlistを拡張する。
data = ["A", "B", "C"]

new_data = data * 3
print(f"data: {data}, id(data): {id(data)}")
print(f"new_data: {new_data}, id(new_data): {id(new_data)}")

# *=を使って拡張する。
print("===")
print(f"*=実行前 data: {data}, id(data): {id(data)}")
data *= 3
print(f"*=実行後 data: {data}, id(data): {id(data)}")
【実行結果】
data: ['A', 'B', 'C'], id(data): 1361669142720
new_data: ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'], id(new_data): 1361653151872
===
*=実行前 data: ['A', 'B', 'C'], id(data): 1361669142720
*=実行後 data: ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'], id(data): 1361669142720

+演算子の場合と同様で、*演算子を用いて別リストに代入する場合は、別idの新しいリストが生成されます。一方で、*=演算子を用いてリストを拡張した場合は、元のリストが拡張されます。

*演算子を用いた拡張の注意点

*演算子でリストを拡張する場合には注意点があります。

*演算子でリスト等の変更可能であるミュータブル(mutable)な要素を持つリストで拡張した場合は、参照がコピーされるため元の要素への変更がそのまま反映される。

言葉だと少しわかりにくいかと思いますので、以下の具体例でみていきましょう。

data = [["A", "B"], ["C", "D"]]
data *= 3
print(f"data: {data}")
# 要素に変更を加える
data[0].append("Z")
print(f"append後 data: {data}")
【実行結果】
data: [['A', 'B'], ['C', 'D'], ['A', 'B'], ['C', 'D'], ['A', 'B'], ['C', 'D']]
append後 data: [['A', 'B', 'Z'], ['C', 'D'], ['A', 'B', 'Z'], ['C', 'D'], ['A', 'B', 'Z'], ['C', 'D']]

上記例では、リストを要素に持つリストを*演算子で拡張しています。

この時に0番目要素のリストに"Z"という文字列をappendした場合、拡張後のリストの0番目だけではなく、2, 4番目の要素にも"Z"が追加されていることが分かります。

これは参照をコピーして拡張していることが理由です。このような変更で問題ない場合には良いのですが、拡張後リストの0番目にのみ変更したかったのだとすると想定外の動作となってしまいます。ミュータブル(mutable)な要素を持つリストで拡張する場合は注意しましょう。

extendとappendの違い

extendメソッドに似たメソッドとしてappendメソッドがあります。extendメソッドとappendメソッドとでどのように結果が異なるかしっかり理解しておきましょう。

print("===== extendの場合")
data = ["A", "B", "C", "D", "E"]
add_data = ["F", "G", "H"]

data.extend(add_data)
print(f"data: {data}")

print("\n===== appendの場合")
data = ["A", "B", "C", "D", "E"]
add_data = ["F", "G", "H"]

data.append(add_data)
print(f"data: {data}")
【実行結果】
===== extendの場合
data: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']

===== appendの場合
data: ['A', 'B', 'C', 'D', 'E', ['F', 'G', 'H']]

上記例を見てみると、extendメソッドの場合は、追加するリストの各要素が順番に既存リストに追加されて拡張されていることが分かります。

一方で、appendメソッドを使用した場合は、5番目の1要素として["F", "G", "H"]というリストが追加されていることが分かります。

上記のようなときには、拡張後リストを参照した時の結果が異なってくるのでよく理解して使いましょう。

extendappendの違い】

  • extendの場合は、追加するリストの各要素が既存リストに順番に追加される。
  • appendを用いてリストを追加した場合は、追加するリスト全体が一つの要素として、既存リストに追加される。

まとめ

Pythonのリスト(list)を拡張する方法について解説しました。

リストを拡張するには、extendメソッドが使用できます。また、リストの拡張方法としては他にも+演算子*演算子appendメソッドがありますので、それぞれがextendメソッドの結果とどのように違うかについても説明しました。

それぞれの方法の特徴をしっかりと押さえてうまくリスト拡張ができるようになりましょう。