2014-12-07 2 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

ответ

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

+0

Большое спасибо. Еще один быстрый вопрос, если длина a большая, какая из них более эффективна? – ilovecp3

+0

@ user3029108 numpy будет более эффективным при увеличении размера массива. – Korem

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

можно достичь, используя один цикл: для повышения эффективности и эффективности

>>> 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] 
Смежные вопросы