ここにこのリストがあるとします:
list = [a, b, c, d, e, f, g]
どのように言うか、同時に index を削除するにはどうすればよい2, 3, 4
です5
か?
pop は複数の値を受け入れません。他にどうすればいいですか?
これはループで行う必要があります。一度に多数のインデックスを削除する組み込み操作はありません。
あなたの例は実際にはインデックスの連続したシーケンスなので、これを行うことができます:
del my_list[2:6]
これにより、2 で始まり 6 の直前で終わるスライスが削除されます。
一般に、インデックスの任意のコレクションを削除する必要があるのか 、それとも常に連続したシーケンスになるのかは、あなたの質問からは明らかではありません。
インデックスの任意のコレクションがある場合は、次のようになります。
indexes = [2, 3, 5]
for index in sorted(indexes, reverse=True):
del my_list[index]
後続のインデックスを破棄しないように、それらを逆の順序で削除する必要があることに注意してください。
remove_indices = [1,2,3]
somelist = [i for j, i in enumerate(somelist) if j not in remove_indices]
例:
In [9]: remove_indices = [1,2,3]
In [10]: somelist = range(10)
In [11]: somelist = [i for j, i in enumerate(somelist) if j not in remove_indices]
In [12]: somelist
Out[12]: [0, 4, 5, 6, 7, 8, 9]
さまざまな方法のパフォーマンスに関するヒントはあまりなかったので、3つの一般的に異なるアプローチすべてで50000から5000アイテムを削除するテストを実行しました.numpyが勝者でした(numpyに収まる要素がある場合):
これが私が計ったコードです(3番目の関数では、numpy配列で直接作業しても問題ない場合は、リストから/への変換が削除される場合があります):
import time
import numpy as np
import random
def del_list_indexes(l, id_to_del):
somelist = [i for j, i in enumerate(l) if j not in id_to_del]
return somelist
def del_list_inplace(l, id_to_del):
for i in sorted(id_to_del, reverse=True):
del(l[i])
def del_list_numpy(l, id_to_del):
arr = np.array(l, dtype='int32')
return list(np.delete(arr, id_to_del))
l = range(50000)
random.shuffle(l)
remove_id = random.sample(range(len(l)), 5000) # 10% ==> 5000
# ...
numpyを使用できる場合は、複数のインデックスを削除できます。
>>> import numpy as np
>>> a = np.arange(10)
>>> np.delete(a,(1,3,5))
array([0, 2, 4, 6, 7, 8, 9])
使用するnp.r_
場合は、スライスを個々のインデックスと組み合わせることができます。
>>> np.delete(a,(np.r_[0:5,7,9]))
array([5, 6, 8])
ただし、削除は ではないin place
ため、それに割り当てる必要があります。
それらが連続している場合は、次のことができます
x[2:6] = []
連続していないインデックスを削除する場合は、少し注意が必要です。
x = [v for i,v in enumerate(x) if i not in frozenset((2,3,4,5))]