179

ここにこのリストがあるとします:

list = [a, b, c, d, e, f, g]

どのように言うか、同時に index を削除するにはどうすればよい2, 3, 4です5か?

pop は複数の値を受け入れません。他にどうすればいいですか?

4

8 に答える 8

337

これはループで行う必要があります。一度に多数のインデックスを削除する組み込み操作はありません。

あなたの例は実際にはインデックスの連続したシーケンスなので、これを行うことができます:

del my_list[2:6]

これにより、2 で始まり 6 の直前で終わるスライスが削除されます。

一般に、インデックスの任意のコレクションを削除する必要があるのか​​ 、それとも常に連続したシーケンスになるのかは、あなたの質問からは明らかではありません。

インデックスの任意のコレクションがある場合は、次のようになります。

indexes = [2, 3, 5]
for index in sorted(indexes, reverse=True):
    del my_list[index]

後続のインデックスを破棄しないように、それらを逆の順序で削除する必要があることに注意してください。

于 2012-07-03T01:08:08.347 に答える
59
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]
于 2012-07-03T01:09:11.980 に答える
31

さまざまな方法のパフォーマンスに関するヒントはあまりなかったので、3つの一般的に異なるアプローチすべてで50000から5000アイテムを削除するテストを実行しました.numpyが勝者でした(numpyに収まる要素がある場合):

  • 列挙型リストの理解に 7.5 秒 [別の PC では 4.5 秒]
  • アイテムを逆順に削除する場合は 0.08 秒 [0.017 (!) 秒]
  • numpy.delete の場合は 0.009 秒 [0.006 秒]

これが私が計ったコードです(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

# ...
于 2016-12-10T20:09:49.573 に答える
16

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ため、それに割り当てる必要があります。

于 2012-07-03T09:22:45.410 に答える
15

それらが連続している場合は、次のことができます

x[2:6] = []

連続していないインデックスを削除する場合は、少し注意が必要です。

x = [v for i,v in enumerate(x) if i not in frozenset((2,3,4,5))] 
于 2012-07-03T01:08:21.570 に答える