2014-12-07 55 views
0

如果我有一个列表如何找到一个元素的所有索引列表中的Python

a=[1,0,0,1,0,1,1,1,0,1,0,0] 

我想分别找到的0和1的指数,在这种情况下说,

index_0 = [1,2,4,8,10,11] 
index_1 = [0,3,5,6,7,9] 

有没有一种有效的方法来做到这一点?

+0

可能重复的[如何在列表中找到所有出现的元素?](http://stackoverflow.com/questions/6294179/how-to-find-all-occurrences-of-an-元素在列表中) – simopopov 2014-12-07 16:46:22

回答

4
index_0 = [i for i, v in enumerate(a) if v == 0] 
index_1 = [i for i, v in enumerate(a) if v == 1] 

或者与numpy的:

import numpy as np 
a = np.array(a) 
index_0 = np.where(a == 0)[0] 
index_1 = np.where(a == 1)[0] 
+1

完美答案。我只是输入相同的:D – simopopov 2014-12-07 16:45:37

+0

非常感谢。还有一个问题,如果a的长度很大,哪一个更有效? – ilovecp3 2014-12-07 16:49:58

+0

@ user3029108随着数组大小的增长,numpy将会更有效。 – Korem 2014-12-07 17:00:20

-1

另一种方式来做到这一点是:

import os 

a = [1,0,0,1,0,1,1,1,0,1,0,0] 
index_0 = [] 
index_1 = [] 
aux = 0 

for i in a: 
    if i == 0: 
     index_0.append(aux) 
     aux += 1 
    else: 
     index_1.append(aux) 
     aux += 1 

print index_0 
print index_1 
0

使用itertools.compress

>>> a=[1,0,0,1,0,1,1,1,0,1,0,0] 
>>> index_1 = [x for x in itertools.compress(range(len(a)),a)] 
>>> index_1 
[0, 3, 5, 6, 7, 9] 
>>> index_0 = [x for x in itertools.compress(range(len(a)),map(lambda x:not x,a))] 
>>> index_0 
[1, 2, 4, 8, 10, 11] 

可以实现使用一个for循环:为更好和更高效率

>>> a=[1,0,0,1,0,1,1,1,0,1,0,0] 
>>> index_0 = [] 
>>> index_1 = [] 
>>> for i,x in enumerate(a): 
...  if x: index_1.append(i) 
...  else: index_0.append(i) 
... 
>>> index_0 
[1, 2, 4, 8, 10, 11] 
>>> index_1 
[0, 3, 5, 6, 7, 9] 
相关问题