如何同时从列表中删除多个索引?
说我在这里有这个列表:
list = [a, b, c, d, e, f, g]
我怎样才能同时删除索引2, 3, 4
和5
?
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]