2013-10-10 50 views
40

*一個項目有一個簡單的方法來索引列表(或陣列,或其他)爲特定索引的所有元素除了?例如,指數所有*除蟒

  • mylist[3]將位置返回項目3

  • milist[~3]將返回整個列表除3

回答

37

對於列表,你可以使用列表組件。例如,爲了使一個ba拷貝而不第三元件:

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] 

這是非常普遍的,並且可以與所有iterables,包括numpy的陣列中使用。如果您有()替換[]b將是一個迭代器,而非列表。

或者你可以用pop做到這一點就地:

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]) 

將,在一般情況下,有多少:

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的,你可以用布爾索引做到這一點比上面列出的列表理解更快。

37
>>> 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] 
>>> 

參見

Explain Python's slice notation

+1

好答案列表的功能。你也可以將它用於數組,但是你需要使用'numpy.concatenate'。 –

+0

很酷的答案! – kingmakerking

21

如果您使用numpy的,最近的地方,我可以用口罩可使用itertools可以實現類似

>>> 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

>>> 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] 
+1

我可能會使用類似'np.arange(LEN(ARR))!= 3'作爲面膜,因爲這樣可內聯,例如'的常用3 [〜(np.arange(LEN(ARR))== 3)]'或任何。 – DSM

+0

@DSM:請張貼此作爲一個答案:-)。無論如何,我都不太熟悉Numpy。 – Abhijit

+0

+1掩蔽的陣列,在列表中的情況下,我會去片並連接在使用壓縮。 –

17

,我發現最簡單的方法是:

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

將產生你的mylist在索引中不x的元素。

+0

我發現這實際上刪除了項目x + 1,但仍然有用,謝謝 –

+1

您必須記住索引是基於0的,所以它工作正常。 –

+0

啊,是的,只是重試了這一點,這是正確的。 +1 –

0

如果你不事先知道這裏的索引,將工作

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