如何同时从列表中删除多个索引?

说我在这里有这个列表:

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

我怎样才能同时删除索引2, 3, 45

stream行音乐不接受多个值。 我还要怎么做?

您需要在循环中执行此操作,没有内置操作可以一次删除多个索引。

你的例子实际上是一个连续的索引序列,所以你可以这样做:

 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] 

如果他们是连续的,你可以做

 x[2:6] = [] 

如果你想删除不连续的索引,这有点棘手。

 x = [v for i,v in enumerate(x) if i not in frozenset((2,3,4,5))] 
 lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; lst = lst[0:2] + lst[6:] 

这是一个单步操作。 它不使用循环,因此执行速度很快。 它使用列表切片。

如果你可以使用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 ,所以你必须分配给它。

对于不同的performance,我的performance并没有太大的提示,所以我在3种不同的方法中进行了从50000中删除5000个项目的testing,对于我来说,numpy是胜利者(如果你有元素适合numpy):

  • 列举的列表理解为7.5秒
  • 按相反顺序删除项目为0.08秒
  • numpy.delete为0.009秒

这是我定时的代码(在第三个函数转换从/到列表可能会被删除,如果直接在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, l)) l = range(50000) random.shuffle(l) remove_id = random.sample(range(len(l)), 5000) # 10% ==> 5000 # ... 

老问题,但我有一个答案。

首先,仔细阅读列表中的元素,如下所示:

 for x in range(len(yourlist)): print '%s: %s' % (x, yourlist[x]) 

然后,用你想popup的元素的索引列表来调用这个函数。 它足够强大,列表的顺序无关紧要。

 def multipop(yourlist, itemstopop): result = [] itemstopop.sort() itemstopop = itemstopop[::-1] for x in itemstopop: result.append(yourlist.pop(x)) return result 

作为奖励,结果应该只包含你想要删除的元素。

在[73]中:mylist = ['a','b','c','d','charles']

在[76]中:对于范围内的x(len(mylist)):

  mylist[x]) 

….:

0:a

1:b

2:c

3:d

4:查尔斯

在[77]中:multipop(mylist,[0,2,4])

Out [77]:['charles','c','a']

在[78]:mylist

Out [78]:['b','d']

另一种select(就地,指数的任何组合):

 _marker = object() for i in indices: my_list[i] = _marker # marked for deletion obj[:] = [v for v in my_list if v is not _marker]