連載
» 2020年12月15日 05時00分 公開

[解決!Python]リスト(配列)から要素を削除するには(del文、remove/clear/popメソッド、リスト内包表記)解決!Python

インデックスやスライス、各種のメソッドを使用してリストから要素を削除する方法を紹介する。

[かわさきしんじ,Deep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

インデックスやスライスを使って要素を削除する

# インデックスを指定してdel文で要素を削除
mylist = list(range(5))  # [0, 1, 2, 3, 4]
del mylist[0]
print(mylist)  # [1, 2, 3, 4]

# スライスを指定してdel文で要素を削除
mylist = list(range(5))  # [0, 1, 2, 3, 4]
del mylist[1:4# 1〜3番目の要素を削除
print(mylist)  # [0, 4]

mylist = list(range(5))  # [0, 1, 2, 3, 4]
del mylist[::2# 0、2、4番目の要素を削除
print(mylist)  # [1, 3]

mylist = list(range(10))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
del mylist[1:7:3# 1番目と4番目の要素を削除
print(mylist)  # [0, 2, 3, 5, 6, 7, 8, 9]

# スライスで指定した範囲に空のリストを代入することで削除
mylist = list(range(10))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
mylist[4:8] = []  # 4〜7番目の要素を削除
print(mylist)  # [0, 1, 2, 3, 8, 9]

print('mylist[:]:', mylist[:])  # mylist[:]: [0, 1, 2, 3, 8, 9]
mylist[:] = []  # リストの全要素を削除
print(mylist)  # []
mylist = list(range(5))
del mylist[:]  # このようにも書ける


 del文でリスト(配列)の要素を削除するには、「del リスト[インデックスまたはスライスの指定]」とする。インデックスを指定したときには、対応する要素が1つ削除される。スライスを指定したときには、その範囲に含まれる要素が全て一括で削除される。あるいは、リストに対してスライスを指定して、そこに空のリストを代入してもよい。詳しくは「インデックスやスライスを使う方法」を参照のこと。

clear/pop/removeメソッドを使って要素を削除する

# clearメソッドでリストの全要素を削除
mylist = list(range(10))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(mylist)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
mylist.clear()
print(mylist)  # []

# popメソッドで指定したインデックスにある要素をリストから削除して、その値を取得
mylist = list(range(10))
value = mylist.pop()  # インデックスを指定しない場合は末尾の要素が削除される
print('popped value:', value)  # popped value: 9
print('mylist:', mylist)  # mylist: [0, 1, 2, 3, 4, 5, 6, 7, 8]

value = mylist.pop(5# 5番目の要素を削除
print('popped value:', value)  # popped value: 5
print('mylist:', mylist)  # mylist: [0, 1, 2, 3, 4, 6, 7, 8]

# removeメソッドで削除したい値を指定して、リストからその値を削除
mylist = [2, 0, 6, 0, 5, 7, 2, 1, 5, 5]

mylist.remove(0# リスト内の要素0のうち先頭にあるものを削除
print(mylist)  # [2, 6, 0, 5, 7, 2, 1, 5, 5]
mylist.remove(0# リスト内の要素0のうち先頭にあるものを削除
print(mylist)  # [2, 6, 5, 7, 2, 1, 5, 5]
mylist.remove(0# ValueError:指定した値がリスト中にないと例外となる

# リストから特定の条件に合致するものをまとめて削除
mylist = [2, 0, 6, 0, 5, 7, 2, 1, 5, 5]
target = 0  # 要素0をmylistから取り除きたい

mylist = [item for item in mylist if item != target]  # 取り除く=それ以外を残す
print(mylist)  # [2, 6, 5, 7, 2, 1, 5, 5]

#target = 0  # 上のリスト内包表記は以下と同値
#result = []
#for item in mylist:
#    if item != target:
#        result.append(item)
#
#mylist = result


 Pythonのリストには、全要素を削除するclearメソッド、指定したインデックスにある要素を削除してその値を返送するpopメソッド、指定した値を削除するremoveメソッドがある。詳細については「clear/pop/removeメソッドを使う方法」を参照のこと。

インデックスやスライスを使う方法

 del文でリスト(配列)の要素を削除するには「del リスト[インデックスまたはスライスの指定]」と記述する。インデックスを指定したときには、そのインデックスにある要素が削除される。スライスを指定したときには、その範囲に含まれる要素が全て一括で削除される。「リスト[削除範囲の先頭:削除範囲の最後] = []」とすることでも要素を削除できる。

 まず、インデックスを指定した場合の例を以下に示す。

mylist = list(range(10))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

del mylist[0# 0番目の要素を削除
print(mylist)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

del mylist[-1# -1番目(末尾)の要素を削除
print(mylist)  # [1, 2, 3, 4, 5, 6, 7, 8]


 インデックスには、正数と負数のいずれでも指定できる(-1は末尾の要素を、-2はその1つ手前の要素を指す)。要素が存在しない範囲を指定するとIndexError例外が発生する。

 次に、スライスを指定する場合の例を以下に示す。スライスを使ったリストの要素へのアクセスについては「リスト(配列)の要素にインデックスやスライスを使ってアクセスするには」も参照されたい。

mylist = list(range(10))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
del mylist[1:5# 1〜4番目の要素を削除
print(mylist)  # [0, 5, 6, 7, 8, 9]

mylist = list(range(10))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
del mylist[:]  # [:]はリストの全要素を表すスライスなので、全要素が削除される
print(mylist)  # []

mylist = list(range(10))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
del mylist[5:]  # 5番目以降の要素が全て削除される
print(mylist)  # [0, 1, 2, 3, 4]

mylist = list(range(10))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
del mylist[:7# 0〜6番目の要素が削除される
print(mylist)  # [7, 8, 9]

mylist = list(range(10))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
del mylist[0:5:2# 0、2、4番目の要素が削除される
print(mylist)  # [1, 3, 5, 6, 7, 8, 9]


 スライスの指定を「[削除範囲の先頭:削除範囲の最後]」としたときには、その範囲にある要素が全て削除される(ただし、「削除範囲の最後」に指定したインデックスの要素はスライスには含まれない)。また、「[削除範囲の先頭:削除範囲の最後:増分]」としたときには、「削除範囲の先頭+増分×i」(iは0以上の整数)という式で算出されるインデックスにある要素が一括で削除される(この式で算出されるインデックスは「削除範囲の先頭」と「削除範囲の最後」に含まれるものとする)。

 スライスに削除範囲の先頭と最後だけを指定した(増分を指定しなかった)場合には、del文ではなく、代入文で空のリストをスライスに代入することでも対応する要素を削除できる。以下に例を示す。

mylist = list(range(10))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

mylist[2:8] = []  # 2〜7番目の要素を削除
print(mylist)  # [0, 1, 8, 9]

print(mylist[0:3:2])  # [0, 8]
mylist[0:3:2] = []  # ValueError


 2つ目の例のように、先頭と最後、増分を指定したスライスでは空のリストを代入しての削除はできない。これは、とびとびのスライスに代入するには、代入先と代入元の要素数が同じでなければならないからだ。

clear/pop/removeメソッドを使う方法

 インデックスとスライス以外にも、以下の3つのメソッドを使ってもリストから要素を削除できる。

  • clearメソッド:全ての要素を削除
  • popメソッド:指定したインデックスにある要素を削除して、その値を返送する。範囲外のインデックスを指定すると例外となる
  • removeメソッド:指定した値がリストにあれば、そのうち先頭(インデックスが最小)のものを削除する。なければ例外となる

 これらについて簡単に見ていこう。

 まずはclearメソッドからだ。このメソッドはリストに含まれる全要素を一括して削除する。引数はない。

mylist = list(range(10))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(mylist)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
mylist.clear()  # 全要素を削除
print(mylist)  # []

# 参考:del mylist[:]、mylist[:] = []


 既に述べたが、「リスト[:]」というスライスはそのリストの全要素を表すので、要素の全削除は「del リスト[:]」や「リスト[:] = []」のようにしても行える。

 popメソッドは、指定したインデックスにある要素を削除して、その値を戻り値として返送する。インデックスを指定しなかった場合には、末尾のリストが取り除かれ、その値が返される。以下に例を示す。

mylist = list(range(10))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

value = mylist.pop()  # 末尾の要素を取り出して、削除
print('popped value:', value)  # popped value: 9
print('mylist:', mylist)  # mylist: [0, 1, 2, 3, 4, 5, 6, 7, 8]

value = mylist.pop(5# 5番目の要素を取り出して、削除
print('popped value:', value)  # popped value: 5
print('mylist:', mylist)  # mylist: [0, 1, 2, 3, 4, 6, 7, 8]

value = mylist.pop(-2# 最後から2つ目の要素を取り出して、削除
print('popped value:', value)  # popped value: 7
print('mylist:', mylist)  # mylist: [0, 1, 2, 3, 4, 6, 8]

value = mylist.pop(10# IndexError:範囲外のインデックスは指定できない


 上に示した通り、インデックスには負数も指定可能だ。また、範囲外のインデックスを指定するとIndexError例外が発生する。

 最後のremoveメソッドでは、インデックスではなく、削除したい値を指定する。指定した値がリストに複数格納されているときには、その中で先頭(つまり、インデックスの値が最小)の要素が削除される。

 以下に例を示す。

mylist = [2, 0, 6, 0, 5, 7, 2, 1, 5, 5]

mylist.remove(0# リスト内の要素0のうち先頭にあるものを削除
print(mylist)  # [2, 6, 0, 5, 7, 2, 1, 5, 5]
mylist.remove(0# リスト内の要素0のうち先頭にあるものを削除
print(mylist)  # [2, 6, 5, 7, 2, 1, 5, 5]
mylist.remove(0# ValueError:指定した値がリスト中にないと例外となる


 最初のremoveメソッド呼び出しでは、インデックス1にある要素0が削除され、次のremoveメソッド呼び出しで(要素が1つ削除された後の新しい)インデックス2にある要素0が削除されていることに注目してほしい。2番目のremoveメソッド呼び出しにより、mylistには要素0が存在しなくなったので、最後のremoveメソッド呼び出しではValueError例外が発生している。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。