索引所有*除了* 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