Pythonの配列・リストの指定要素を削除する方法。OKパターンとNGパターンを紹介。

phtyonロゴ

Pythonでも、一般の他プログラミング言語と同様に配列やリストを扱うことができます。

今回は、配列やリストに対して指定要素を削除する際の方法を紹介していきます。


環境情報


  • Python 3.4.1

配列


配列に対しての要素削除方法について説明していきます。

削除と一言でいっても様々な方法があります。

それぞれサンプルプログラム付きで説明していきます。


全削除


配列の全削除は、clearを使用します。


プログラムとしては以下になります。

array = ["A", "B", "C", "D", "E"]
print(array)
array.clear()
print(array)

以下のように、配列の要素は全削除されます。

['A', 'B', 'C', 'D', 'E']
[]

指定位置要素を削除


削除する要素の位置(インデックス)が分かっている場合は、popを使います。
popを使うと、指定位置の要素が削除され、同時に削除した要素の取得もおこなうことができます。


array = ["A", "B", "C", "D", "E"]
print(array)
val = array.pop(2)
print(val)
print(array)

以下のように、指定位置の要素を取得した上で、削除をおこなっています。

['A', 'B', 'C', 'D', 'E']
C
['A', 'B', 'D', 'E']

指定要素と一致する要素を削除


削除する要素の中身が分かっている場合は、removeを使います。


array = ["A", "B", "C", "D", "E"]
print(array)
array.remove("C")
print(array)

以下のように、指定した要素のみが削除されます。

['A', 'B', 'C', 'D', 'E']
['A', 'B', 'D', 'E']

 


繰り返し中に削除/NGパターン


配列の要素を繰り返しで検索していき、削除する要素であった場合は削除する、というパターンはよくあるかと思います。
この場合、配列を先頭から検索して削除する方法はNGになります。


array = ["A", "B", "C", "D", "E"]
lc = 0
for val in array:
    print(val)
    if val == "C":
        array.remove(val)
    print(array)
    lc = lc + 1
print(array)

NGなのは、要素の「C」を削除するときで要素がずれてしまい、次の検索要素が「E」になってしまっているという点です。
本来であれば、「C」の次は「D」が正解になります。


A
['A', 'B', 'C', 'D', 'E']
B
['A', 'B', 'C', 'D', 'E']
C
['A', 'B', 'D', 'E']
E
['A', 'B', 'D', 'E']
['A', 'B', 'D', 'E']

繰り返し中に削除/OKパターン


繰り返し中に削除する方式のOKパターンとしては、末尾から先頭へ繰り返しをおこなう方法です。
末尾から繰り返しをおこなうためには、「reversed」を使います。


array = ["A", "B", "C", "D", "E"]
lc = 0
for val in reversed(array):
    print(val)
    if val == "C":
        array.remove(val)
    print(array)
    lc = lc + 1
print(array)

末尾からループして指定要素を削除しているので、削除した「C」の後に「B」を検索しています。
この方法が正解であることがわかります。


E
['A', 'B', 'C', 'D', 'E']
D
['A', 'B', 'C', 'D', 'E']
C
['A', 'B', 'D', 'E']
B
['A', 'B', 'D', 'E']
A
['A', 'B', 'D', 'E']
['A', 'B', 'D', 'E']

リスト


リストに対しても配列と同じ方法で削除操作をおこなうことができます。


全削除


リストの全削除も、配列と同様にclearを使用します。


array = [["A", "B", "C"], ["D", "E", "F"], ["G", "H", "I"]]
print(array)
array.clear()
print(array)

[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I']]
[]

指定位置要素を削除


削除する要素の位置(インデックス)が分かっている場合も、配列と同様にpopを使います。


array = [["A", "B", "C"], ["D", "E", "F"], ["G", "H", "I"]]
print(array)
val = array.pop(1)
print(val)
print(array)

[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I']]
['D', 'E', 'F']
[['A', 'B', 'C'], ['G', 'H', 'I']]

指定要素と一致する要素を削除


削除する要素の中身が分かっている場合も、配列と同様にremoveを使います。


array = [["A", "B", "C"], ["D", "E", "F"], ["G", "H", "I"]]
print(array)
array.remove(["D", "E", "F"])
print(array)

[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I']]
[['A', 'B', 'C'], ['G', 'H', 'I']]

繰り返し中に削除


配列と同様に、リストの要素を繰り返しして削除をおこなう方法は、先頭から繰り返しをおこなうのではなく、末尾から繰り返しをおこなって削除をおこなう方法が正解となります。 配列と同様にreversedを使います。


array = [["A", "B", "C"], ["D", "E", "F"], ["G", "H", "I"]]
lc = 0
for val in reversed(array):
    print(val)
    if val == ["D", "E", "F"]:
        array.remove(val)
    print(array)
    lc = lc + 1
print(array)

['G', 'H', 'I']
[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I']]
['D', 'E', 'F']
[['A', 'B', 'C'], ['G', 'H', 'I']]
['A', 'B', 'C']
[['A', 'B', 'C'], ['G', 'H', 'I']]
[['A', 'B', 'C'], ['G', 'H', 'I']]