note.nkmk.me

Pythonでリスト(配列)の要素を削除するclear, pop, remove, del

Date: 2018-01-29 / Modified: 2019-07-01 / tags: Python, リスト

Pythonでlist型のリスト(配列)の要素を削除するには、リストのメソッドclaer(), pop(), remove()を使う。そのほか、インデックスやスライスで位置・範囲を指定してdel文で削除する方法もある。

  • すべての要素を削除: clear()
  • 指定した位置の要素を削除し、値を取得: pop()
  • 指定した値と同じ要素を検索し、最初の要素を削除: remove()
  • 条件を満たす複数の要素を一括で削除: リスト内包表記
  • インデックス・スライスで位置・範囲を指定して削除: del

なお、リストは異なる型のデータを格納可能で、厳密には配列とは異なる。メモリサイズやメモリアドレスを必要とするような処理や大規模なデータの数値計算処理などで配列を扱いたい場合はarray(標準ライブラリ)やNumPyを使う。

スポンサーリンク

すべての要素を削除: clear()

リストのメソッドclear()で、すべての要素が削除され、空のリストになる。

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

l.clear()
print(l)
# []

指定した位置の要素を削除し、値を取得: pop()

リストのメソッドpop()で、指定した位置の要素を削除し、その要素の値を取得できる。

先頭(最初)は0

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

print(l.pop(0))
# 0

print(l)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

print(l.pop(3))
# 4

print(l)
# [1, 2, 3, 5, 6, 7, 8, 9]

負の値を使って末尾(最後)からの位置を指定することもできる。末尾(最後)は-1

print(l.pop(-2))
# 8

print(l)
# [1, 2, 3, 5, 6, 7, 9]

引数を省略して位置を指定しない場合は、末尾(最後)の要素を削除する。

print(l.pop())
# 9

print(l)
# [1, 2, 3, 5, 6, 7]

存在しない位置を指定するとエラーになる。

# print(l.pop(100))
# IndexError: pop index out of range

なお、先頭の要素を削除するpop(0)O(n)のコストを必要とし、効率的な操作ではない。リストの各種操作に対する計算量は公式のWikiの以下のページを参照。

先頭への要素の削除をO(1)で行う型として標準ライブラリcollectionsモジュールにdeque型が用意されている。例えばデータをキュー(queue, FIFO)として扱いたい場合はdequeを使うほうが効率的。

指定した値と同じ要素を検索し、最初の要素を削除: remove()

リストのメソッドremove()で、指定した値と同じ要素を検索し、最初の要素を削除できる。

l = ['Alice', 'Bob', 'Charlie', 'Bob', 'Dave']
print(l)
# ['Alice', 'Bob', 'Charlie', 'Bob', 'Dave']

l.remove('Alice')
print(l)
# ['Bob', 'Charlie', 'Bob', 'Dave']

指定した値に一致する要素がリストに複数含まれる場合は、最初の一つだけが削除される。

l.remove('Bob')
print(l)
# ['Charlie', 'Bob', 'Dave']

存在しない値を指定するとエラーになる。

# l.remove('xxx')
# ValueError: list.remove(x): x not in list

条件を満たす複数の要素を一括で削除: リスト内包表記

条件を満たす要素を削除する、という処理は、条件を満たさない要素を残す(抽出する)、という処理に等しい。このような処理にはリスト内包表記を利用する。

奇数または偶数の要素を削除する(= 偶数または奇数の要素を残す)例は以下の通り。%は剰余演算子でi % 2i2で割った余り。

なお、リスト内包表記では新たなリストが生成される。これまで紹介したリスト型のメソッドとは異なり、元のリストはそのまま。

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

print([i for i in l if i % 2 == 0])
# [0, 2, 4, 6, 8]

print([i for i in l if i % 2 != 0])
# [1, 3, 5, 7, 9]

print(l)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

リスト内包表記を利用した特定の要素の抽出などについての詳細は以下の記事を参照。

そのほかの例。条件式によって様々な処理が可能。

l = ['Alice', 'Bob', 'Charlie', 'Bob', 'David']
print(l)
# ['Alice', 'Bob', 'Charlie', 'Bob', 'David']

print([s for s in l if s != 'Bob'])
# ['Alice', 'Charlie', 'David']

print([s for s in l if s.endswith('e')])
# ['Alice', 'Charlie']

文字列のリストに対する具体例は以下の記事を参照。

重複要素を削除したい場合は集合set型を利用する。

print(list(set(l)))
# ['David', 'Alice', 'Charlie', 'Bob']

元のリストの順序を保持したい場合などの詳細は以下の記事を参照。

インデックス・スライスで位置・範囲を指定して削除: del

clear(), pop(), remove()はリストのメソッドだが、del文でリストの要素を削除することもできる。

削除したい要素をインデックスで指定する。先頭(最初)は0で、末尾(最後)は-1

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

del l[0]
print(l)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

del l[-1]
print(l)
# [1, 2, 3, 4, 5, 6, 7, 8]

del l[6]
print(l)
# [1, 2, 3, 4, 5, 6, 8]

スライスで範囲を指定すると、複数の要素を一括で削除できる。

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

del l[2:5]
print(l)
# [0, 1, 5, 6, 7, 8, 9]

l = list(range(10))
del l[:3]
print(l)
# [3, 4, 5, 6, 7, 8, 9]

l = list(range(10))
del l[4:]
print(l)
# [0, 1, 2, 3]

l = list(range(10))
del l[-3:]
print(l)
# [0, 1, 2, 3, 4, 5, 6]

全範囲を指定してすべての要素を削除することも可能。

l = list(range(10))
del l[:]
print(l)
# []

スライスでの範囲指定を[start:stop:step]として増分stepを指定すると、飛び飛びの複数の要素を一括で削除できる。

l = list(range(10))
del l[2:8:2]
print(l)
# [0, 1, 3, 5, 7, 8, 9]

l = list(range(10))
del l[::3]
print(l)
# [1, 2, 4, 5, 7, 8]

スライスについての詳細は以下の記事を参照。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事