索引所有*除了* python中的一个项目

有一个简单的方法来索引列表(或数组,或其他任何) 除了特定的索引的所有元素? 例如,

  • mylist[3]将返回位置3的项目

  • milist[~3]将返回除3之外的全部列表

对于一个列表 ,你可以使用列表组件。 例如,要使b没有第三个元素的副本:

 a = range(10)[::-1] # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] b = [x for i,x in enumerate(a) if i!=3] # [9, 8, 7, 5, 4, 3, 2, 1, 0] 

这是非常一般的,可以用于所有的迭代,包括numpy数组。 如果用()replace[]b将是一个迭代器而不是一个列表。

或者你可以用pop来做到这一点:

 a = range(10)[::-1] # a = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] a.pop(3) # a = [9, 8, 7, 5, 4, 3, 2, 1, 0] 

numpy中,你可以用布尔索引来做到这一点:

 a = np.arange(9, -1, -1) # a = array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0]) b = a[np.arange(len(a))!=3] # b = array([9, 8, 7, 5, 4, 3, 2, 1, 0]) 

这通常比上面列出的列表理解要快得多。

 >>> l = range(1,10) >>> l [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> l[:2] [1, 2] >>> l[3:] [4, 5, 6, 7, 8, 9] >>> l[:2] + l[3:] [1, 2, 4, 5, 6, 7, 8, 9] >>> 

也可以看看

解释Python的切片符号

如果你使用numpy,最近的,我能想到的是使用一个面具

 >>> import numpy as np >>> arr = np.arange(1,10) >>> mask = np.ones(arr.shape,dtype=bool) >>> mask[5]=0 >>> arr[mask] array([1, 2, 3, 4, 5, 7, 8, 9]) 

使用没有numpy itertools可以实现类似的function

 >>> from itertools import compress >>> arr = range(1,10) >>> mask = [1]*len(arr) >>> mask[5]=0 >>> list(compress(arr,mask)) [1, 2, 3, 4, 5, 7, 8, 9] 

我发现最简单的方法是:

 mylist[:x]+mylist[x+1:] 

这将产生你的mylist没有在索引x的元素。

如果你事先不知道这个索引,这里是一个可以工作的函数

 def reverse_index(l, index): try: l.pop(index) return l except IndexError: return False