シリーズ「Pythonプログラミングの始め方」では、Pythonの基礎文法を図を用いて分かりやすく解説していきます。
前回の記事では、Pythonのデータ構造の1つであるリスト<List>の扱い方の基本を紹介しました。
リストは、[要素1, 要素2, ・・・]のように、”[]”(角カッコ)の中に要素が“,”(カンマ)区切りで並びます。リストは、ミュータブル(mutable)なデータ構造で、要素の追加・更新・削除を自由に行うことができるのでした。
List(リスト)の定義(生成)方法、参照と更新、連結といった基本操作については以下の記事を参考にしてください。
さて今回は、リストの使い方の【応用編】として、リストオブジェクトが提供するさまざまな機能について解説を進めたいと思います。Pythonで多用されるリストには、さまざまな操作を効率的に行うためのメソッドが予め用意されています。
たとえば、、
- リストに要素を追加する
- リストから特定の要素を抜き取る(削除する)
- 要素を並び替える
- 特定の要素を探索・調査する ・・・
などです。ですので自身でコーディングする前に、Python(リスト)が提供する機能やメソッドが存在しないか調べ、あれば積極的に活用すべきだと筆者は考えます。
本記事は、数あるリスト系メソッドの中から「リストに要素を追加する」「リストから特定の要素を抜き取る(削除する)」について解説します。
重要度:★★★★☆
なお、詳細については公式ドキュメント「Python標準ライブラリ」(シーケンス型・ミュータブル)に記載内容も併せて確認頂きたくよろしくお願いいたします。
Python標準ライブラリ シーケンス型(ミュータブル)
https://docs.python.org/ja/3/library/stdtypes.html#mutable-sequence-types
1. 要素を追加する(append/extend/insert)
本節では、要素をリストに追加するためのメソッド「append/extend/insert」を紹介します。Pythonには、標準機能として「+演算子」や「スライス」を使っても同じことができますので、合わせて解説します。
1.1 末尾に要素を追加する: append()
既存のListオブジェクトに要素を末尾に追加(末尾)するには、append() メソッドを使う方法があります。書式と概略図は次のとおりです。
なお、任意の位置に挿入するには後述する「insert()」があります。
appendメソッドの使用例を示します。新規リストを作る場合は中身のない空のリストをあらかじめ用意しそこに要素を追加していきます。追加できる要素には数値や文字列はもちろんのことリストやタプル、辞書といったオブジェクトも追加することができます。
オブジェクトを追加する際は、オブジェクトごと追加されます、個々の要素に分解されて追加されるわけではないので注意してください。(List1_➂) また「appendメソッド」は戻り値は返しません。オリジナルのListオブジェクトを変更しますので注意してください。
# append()メソッドの使用例
# 空のリストを用意
data = []
# 末尾に10を追加
data.append(10)
# 末尾に20を追加
data.append(20)
print(data) # ➀>> [10, 20]
# 末尾に30を追加
data.append(30)
print(data) # ➁>> [10, 20, 30]
#-----------------------------------------------------------------------------
# リストを追加
data.append([1, 2])
# 辞書を追加
data.append({ "key1": 123 })
# タプルを追加
data.append((1, 2))
print(data) # ➂>> [10, 20, 30, [1, 2], {'key1': 123}, (1, 2)]
append() 実行結果
➀》[10, 20]
➁》[10, 20, 30]
➂》[10, 20, 30, [1, 2], {‘key1’: 123}, (1, 2)] ※.オブジェクトはそのまま追加される
1.2 末尾に要素を追加する: extend()
<1.1項>の append() と同じように末尾に要素を追加する機能を提供するメソッドに次の「extend()」もあります。書式は以下の通りです。
append() との違いは、引数で指定するシーケンスオブジェクトの取り扱い方です。append() は(シーケンス)オブジェクトを1つの要素として末尾に追加しますが、extend() は(シーケンス)オブジェクトを展開しながら一つづつ追加していく点が異なります。(図2)
extend() の使用例を示します。
2つのリストを連結しますが、追加するリストの要素を分解しながら末尾に繋がていきます。また、文字列の場合は、各文字ごとに分割されながら追加されていきます。(List2-➂)
また、extend()も、戻り値は返しません。元のListオブジェクトを変更しますので注意してください。
# extend()メソッドの使用例
data_1 = [1, 2, 3]
data_2 = ['a', 'b', 'c']
# extend()の実行(data_1にdata_2を追加)
data_1.extend(data_2)
print(data_1) # ➀>> [1, 2, 3, 'a', 'b', 'c']
data_1 = [1, 2, 3] # 元リストの初期化
# extend()の実行(data_2にdata_1を追加)
data_2.extend(data_1)
print(data_2) # ➁>> ['a', 'b', 'c', 1, 2, 3]
# extend()の実行(data_1に文字列を追加)
data_1.extend("Python")
print(data_1) # ➂>> [1, 2, 3, 'P', 'y', 't', 'h', 'o', 'n']
extend() の実行結果
➀》[1, 2, 3, ‘a’, ‘b’, ‘c’]
➁》[‘a’, ‘b’, ‘c’, 1, 2, 3]
➂》[1, 2, 3, ‘P‘, ‘y‘, ‘t‘, ‘h‘, ‘o‘, ‘n‘]
なお、extend() と同じことは、Pythonの演算子である「+」を使うことでも実現できます。「+演算子」による連結であれば元のリストを更新することなく新たなリストが生成されます。<List3>
関連記事<演算子でリストを連結する>
# +演算子を使った要素の追加
data_1 = [1, 2, 3]
data_2 = ['a', 'b', 'c']
print(data_1 + data_2)
# >>[1, 2, 3, 'a', 'b', 'c']
# オリジナルのリストを書き換えることはない
print(data_1) # >>[1, 2, 3]
print(data_2) # >>['a', 'b', 'c']
1.3 新規要素を挿入する: insert()
既存のリストの任意の位置に新たな要素を挿入するには、insert()メソッドがあります。第1引数に挿入する位置(インデックス)、第2引数に挿入する値やオブジェクトを指定します。挿入位置は、正負で指定でき “0で先頭”、“-1が末尾から1つ前”の位置となります。書式と解略図は次の通りです。
insert() の使用例を示します。<List4>挿入した要素以降のインデックスは、1つずつ後ろにずれていきます。追加できる要素は、数値や文字列はもちろんのこと、オブジェクト(リストやタプル、辞書)も挿入することができます。オブジェクトの場合は<1.2 append()>同様にオブジェクトごとそのまま追加されます。
また、insert() も戻り値は返しません。元のListオブジェクトを変更しますので注意してください。
# insert()メソッドの使用例
data = ["a", "b", "c", "d", "e"]
# 2つ目の要素に(先頭3番目の要素)数値を挿入
data.insert(2, 1)
print(data) # ➀>> ['a', 'b', 1, 'c', 'd', 'e']
# 2つ目の要素に文字列を挿入
data.insert(2, "apple")
print(data) # ➁>> ['a', 'b', 'apple', 1, 'c', 'd', 'e']
#-----------------------------------------------------------------------------
# リストオブジェクトを挿入
data.insert(2, [1, 2])
# 辞書オブジェクトを挿入
data.insert(2, { "key1": 123 })
# タプルオブジェクトを挿入
data.insert(2, (1, 2))
print(data)
# ➂>> ['a', 'b', (1, 2), {'key1': 123}, [1, 2], 'apple', 1, 'c', 'd', 'e']
insert() の実行結果
➀》[‘a’, ‘b’, 1, ‘c’, ‘d’, ‘e’]
➁》[‘a’, ‘b’, ‘apple’, 1, ‘c’, ‘d’, ‘e’]
➂》[‘a’, ‘b’, (1, 2), {‘key1’: 123}, [1, 2], ‘apple’, 1, ‘c’, ‘d’, ‘e’]
なお、insert() と同じことは、リストの「スライス」を使っても実現できます。<List5>
[挿入位置:挿入位置]とすることで任意の位置に挿入が可能です。:の前後に同じインデックスを指定する点がポイントです。関連記事<スライスによるリストの参照>
# スライスを使った要素の挿入
data = ["a", "b", "c", "d", "e"]
data[2:2] = [100, 200, 300]
print(data)
# >>['a', 'b', 100, 200, 300, 'c', 'd', 'e']
# 次のように定数だけでの挿入はできないので注意
#data[2:2] = 100
# >>TypeError: can only assign an iterable
2. 要素を抜き取る(pop/remove/clear/del文)
本節では、リストから要素を抜き取る(削除)ためのメソッドを紹介します。対象の要素をインデックス指定する「pop()」、値指定する「remove()」、すべての要素をクリアする「clear()」があります。また、Pythonの「del文」による要素の削除もできます。
2.1 インデックス指定による要素の抜取(1): pop()
リストから要素の位置(インデックス)を指定して抜き取るメソッドに pop() があります。先頭要素が「0」、末尾の要素が「-1」といったように正負で指定できます。抜き取った要素は戻り値として取得できます。書式は次のようになります。
pop() の 引数:index はオプショナルで、引数を省略した場合は最後の要素が対象となります。これは、引数に「-1」を指定した場合と等価となります。(図4)
また、要素を指定して抜き取る場合には、先述のとおりインデックスを指定します。抜き取った後は、残った後方の要素が順次おくられ再配置されます。(図5)
いずれの場合も抜き取り対象の要素が「戻り値」として得られます。
pop() の使用例です<List6>。引数を省略して、2つの要素をもつリストから順番に末尾のデータを抜き出します。pop()メソッドの実行結果として抜き取った要素を返します。(➀~➃)
空になったリストからさらに実行しようとするとエラーが発生します。存在しない要素をしてすると「IndexError」が発生します。(⑤)
# pop()メソッドの使用例
words = ["blue", "red"]
# 末尾の要素(red)を抜き取る
pop_word = words.pop()
print(words) # ➀>> ['blue'] 残ったリストは'blue'のみ
print(pop_word) # ➁>> red 抜き出した要素'red'が戻り値になる
# 末尾の残りの要素(blue)を抜き取る
pop_word = words.pop()
print(words) # ➂>> []空のリストとなる
print(pop_word) # ➃>> blue 抜き出した要素'blue'が戻り値になる
#-----------------------------------------------------------------------
# 空のリストから抜き取る(エラー発生)
pop_word = words.pop() # ➄>> IndexError: pop from empty list
pop() の実行結果
➀》[‘blue’]
➁》red
➂》[]
➃》blue
➄》IndexError: pop from empty list
2.2 インデックス指定による要素の抜取(2): del文
リストの位置(インデックス)指定で要素を抜き取るその他の方法に「del文」を使うといったものがあります。書式は次の通りで、対象位置をスライス形式で指定して、del文を実行します。また、戻り値は返しません、元のListオブジェクトを変更します。
「del文」の使用例です<List7>。抜き取り対象をスライス形式で指定します。
➂のようにリスト名だけを指定すると、オブジェクトそのものが削除されます。(空のリストも残しませんので注意してください。)
data = ["a", "b", "c", "d", "e", "f", "g", "h"]
# ➀.開始:終了位置の指定
del data[3:6]
print(data)
# >>['a', 'b', 'c', 'g', 'h']
# ----------------------------------------------------------------
data = ["a", "b", "c", "d", "e", "f", "g", "h"]
# ➁.全要素の削除
del data[:]
print(data)
# >>[]
# ----------------------------------------------------------------
data = ["a", "b", "c", "d", "e", "f", "g", "h"]
# ➂.リストオブジェクトそのものを削除
del data
print(data)
# >>NameError: name 'data' is not defined
2.3 要素(値)を指定して抜き取る: remove()
リストから抜き取りたい要素(値)を指定することもできます。remove() メソッドを次の書式のようにして使います。対象の要素が複数存在する場合は、最初に見つかった要素だけが抜き取られます。対象の要素が存在しなかった場合は、エラー(ValueError)が発生します。
前節の pop()とは異なり、抜き取った要素は戻り値として返しません。
次は、remove()メソッドの使用例です<List7>。リストから特定の要素(‘red’)を検索して抜き取っていきます。この例では、要素が重複しているので remove() を実行する度に順番に抜き取れれます。(➀,②) 対象が存在しない場合に、実行すると「ValueError」が発生します。(➂)
# remove()メソッドの使用例(1)
words = ["blue", "red", "yellow", "red", "green"]
# 1つ目の"red"の取り出し
words.remove("red")
print(words) # ➀>> ['blue', 'yellow', 'red', 'green']
# 2つ目の"red"の取り出し
words.remove("red")
print(words) # ➁>> ['blue', 'yellow', 'green']
# 3つ目の"red"を取り出そうとしてもないのでエラー
words.remove("red")
print(words) # ➂>> ValueError: list.remove(x): x not in list
remove() の実行結果(1)
➀》[‘blue’, ‘yellow’, ‘red’, ‘green’]
➁》[‘blue’, ‘yellow’, ‘green’]
➂》ValueError: list.remove(x): x not in list
ValueErrorを回避するために、inステートメント で事前にリストに対象の要素が含まれているかチェックしてから remove() を実行します。<List9>
次の例では「If-in構文」「while-in構文」で確認した後に remove() を都度実行しています。
# remove()メソッドの使用例(2)
# if-in文によるエラー回避策
words = ["blue", "red", "yellow", "red", "green"]
# if-in文による判定
if "red" in words:
words.remove("red") # 1つ目の"red"の取り出し
print(words) # ➀>> ['blue', 'yellow', 'red', 'green']
# if-in文による判定
if "red" in words:
words.remove("red") # 2つ目の"red"の取り出し
print(words) # ➁>> ['blue', 'yellow', 'green']
# if-in文による判定
if "red" in words:
words.remove("red") # if-in文がFalseになるためこのremoveは実行されない
print(words)
#-----------------------------------------------------------------------
# while-in文によるエラー回避策
words = ["blue", "red", "yellow", "red", "green"]
# "red"がリストに内包している間くり返してremove()を実行する
while "red" in words:
words.remove("red")
print(words) # ➂>> ['blue', 'yellow', 'green']
remove() の実行結果(2)
If-in: 構文によるエラー回避
➀》[‘blue’, ‘yellow’, ‘red’, ‘green’]
➁》[‘blue’, ‘yellow’, ‘green’]
while-in: 構文によるエラー回避
➂》[‘blue’, ‘yellow’, ‘green’]
なお、特定の要素(値)を指定して抜き取る操作ですが、remove()メソッドを使わずとも、Pythonの条件文付き内包表記で記述することでも対応できます。
関連記事<条件文付きない内包表記>
words = ["blue", "red", "yellow", "red", "green"]
# 内包表記による、特定要素の抜取り
print([word for word in words if word != "red"])
# >>['blue', 'yellow', 'green']
2.4 全ての要素をクリアする:clear()
全ての要素を削除して、空のリストにするには clear()メソッドを使います。
words = ["blue", "red", "yellow", "red", "green"]
# clearメソッドによるリストの初期化
words.clear()
print(words)
# >>[] 空のリスト
3. まとめ
いかがでしたでしょうか。
今回は、リストの使い方の【応用編】として、リストオブジェクトが提供する数あるメソッドの中から「リストに要素を追加する」「リストから特定の要素を抜き取る(削除する)」について解説してきました。
自身でコーディングする前に、Python(リスト)が提供する機能やメソッドが存在しないか調べ、あれば積極的に活用していきましょう。
最後に、ポイントを確認しておきましょう。
「Listオブジェクト」には、操作を効率的に行うためのメソッドが提供されている
上記以外にも、要素の並び替え(ソート)・探索などのカテゴリがある。
また、リストの基本操作として参照や更新・連結・比較の仕方を次の関連記事でも解説をしています。ぜひこちらも参照していただければと思います。
最後までお読みいただきありがとうございました。