- 1. 概要
- 2. クリア
- 3. ループしながら削除
- 4. 範囲を指定して削除
- 5. 要素を抽出して削除
1. 概要
配列・リストをクリアしたり、要素削除したりする操作に関するメモです。
本ページは、下記のサイトを参考にさせていただきました。
「Python でリスト(配列)の要素を削除する clear, pop, remove, del」
2. クリア
「clear()」という関数を使用すると、クリアできます。
list = [ 'one', 'two', 'three' ]
print(list)
list.clear()
print(list)
というソースを実行すると、下記の結果が得られます
['one', 'two', 'three']
[]
3. ループしながら削除
これは他の言語でも、配列のオブジェクトを扱うときに、いつも問題になることなのですが・・・。
配列の全件ループを行っているときに、配列自体を操作しようとすると、そのループが正常に回っていくかという命題です。
list = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
print(list)
for i in list:
if (not (i % 3)):
list.remove(i)
print(list)
for i in list:
list.remove(i)
print(list)
を実行すると
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 4, 5, 7, 8, 10]
[2, 5, 8]
という結果が得られます。
1 から 10 までの値の入っている配列で、5~7 行で、3の倍数を削除して、うまくいったように見えますが。
3 がぬけても、5以降を処理するので、なんとかうまくいっている。
調子にのって全件削除しちゃおうと 15~16行を実行すると、1つ飛ばしで残ってしまう。
ループ中に、中身が削除されたために、カウンタがずれちゃって削除した次のカウントの処理を飛ばしちゃうんですな。
3の倍数だと、飛ばした次は、3の倍数ではないので、気が付かないということになります。
これを解決するには、
list = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
print(list)
for i in list[:]:
if (not (i % 3)):
list.remove(i)
print(list)
for i in list[:]:
list.remove(i)
print(list)
というような書き方をするとよいそうです。
「配列[:]」で、オブジェクトのコピーを使うそうです。
これを辞書型でやろうとすると書き方がわからない。
今んとこ、全部のキーを削除してやろうと思うと、わたしには、下記のような書き方しかできません。
dic = { 1 : 1, 2 : 2, 3 : 3, 4 : 4, 5 : 5, 6 : 6, 7 : 7, 8 : 8, 9 : 9, 10 : 10, }
print(dic)
for i in list(dic):
del dic[i]
print(dic)
4. 範囲を指定して削除
「del」という文を使います。
「del」は、オブジェクトや単一変数につかうと、そのインスタンスが削除されますが。
配列に対して、範囲を指定して削除することができます。
import copy
l1 = [ 'one', 'two', 'three', 'four' , 'five' ]
l2 = copy.deepcopy(l1); l3 = copy.deepcopy(l1); l4 = copy.deepcopy(l1)
print(l1); print(l2); print(l3); print(l4, end='\n\n')
del l1[1:3]; del l2[:3]; del l3[3:]; del l4[-3:]
print(l1); print(l2); print(l3); print(l4)
上記を実行すると、下記の結果が得られます。
['one', 'two', 'three', 'four', 'five']
['one', 'two', 'three', 'four', 'five']
['one', 'two', 'three', 'four', 'five']
['one', 'two', 'three', 'four', 'five']
['one', 'four', 'five']
['four', 'five']
['one', 'two', 'three']
['one', 'two']
すなわち。
del 配列[m:n] → m 番目から n 番目の要素を削除
del 配列[:m] → 前から m 番目までの要素を削除
del 配列[m:] → m 番目末尾までのの要素を削除
del 配列[-m:] → 末尾から数えて、m 番目以降の要素を削除
ってことになります。
5. 要素を抽出して削除
配列のある条件のものを抽出して削除するには。
配列 = [ 要素 for 要素 in 配列 if 要素を残す条件 ]
てな構文を使います。
l1 = [ 1, None, 2, 3, 4, 5]; l2 = [ 6, 7, 8, None, 9, 10]
l3 = l1[:] + l2[:]
print(l1); print(l2); print(l3, end='\n\n')
l1 = [ i for i in l1 if i != None ]
l2 = [ i for i in l2 if i != None ]
l3 = l1[:] + l2[:]
print(l3)
上記のソースを実行すると、下記の結果が得られます。
[1, None, 2, 3, 4, 5]
[6, 7, 8, None, 9, 10]
[1, None, 2, 3, 4, 5, 6, 7, 8, None, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|