Получение индексов True значений в булевом списке

У меня есть часть моего кода, где я должен создать коммутатор. Я хочу вернуть список всех включенных переключателей. Здесь «on» будет равен True и «off» равен False . Поэтому теперь я просто хочу вернуть список всех значений True и их позиции. Это все, что у меня есть, но оно возвращает только позицию первого появления True (это всего лишь часть моего кода):

 self.states = [False, False, False, False, True, True, False, True, False, False, False, False, False, False, False, False] def which_switch(self): x = [self.states.index(i) for i in self.states if i == True] 

Это возвращает только "4"

4 Solutions collect form web for “Получение индексов True значений в булевом списке”

Используйте enumerate , list.index возвращает индекс первого найденного совпадения.

 >>> t = [False, False, False, False, True, True, False, True, False, False, False, False, False, False, False, False] >>> [i for i, x in enumerate(t) if x] [4, 5, 7] 

Для огромных списков было бы лучше использовать itertools.compress :

 >>> from itertools import compress >>> list(compress(xrange(len(t)), t)) [4, 5, 7] >>> t = t*1000 >>> %timeit [i for i, x in enumerate(t) if x] 100 loops, best of 3: 2.55 ms per loop >>> %timeit list(compress(xrange(len(t)), t)) 1000 loops, best of 3: 696 µs per loop 

Если у вас имеется numpy:

 >>> import numpy as np >>> states = [False, False, False, False, True, True, False, True, False, False, False, False, False, False, False, False] >>> np.where(states) (array([4, 5, 7]),) 

Вы можете использовать для этого фильтр:

 filter(lambda x: self.states[x], range(len(self.states))) 

range здесь перечисляет элементы вашего списка, и поскольку мы хотим только те, где self.statesTrue , мы применяем фильтр, основанный на этом условии.

Используйте способ понимания словаря,

 x = {k:v for k,v in enumerate(states) if v == True} 

Входные данные:

 states = [False, False, False, False, True, True, False, True, False, False, False, False, False, False, False, False] 

Вывод:

 {4: True, 5: True, 7: True} 
Interesting Posts

Возможная ошибка в модуле pdb в Python 3 при использовании генераторов списков

Вычтите год из столбца datetime в пандах

Ошибка python easy_install с ошибкой сертификата SSL для всех пакетов

Круговая зависимость в Python

Использование сеанса SQLAlchemy из Flask повышает «объекты SQLite, созданные в потоке, могут использоваться только в том же потоке»

как переопределить подробное имя поля модели суперкласса в django

Как выводить абзац с разрывами строк в django и mysql?

Получение температуры процессора с помощью Python?

Проверьте, есть ли строка в списке, в зависимости от двух последних символов

Найти в комбинациях python взаимоисключающих наборов из элементов списка

Python запускает системную команду, а затем выйдет … не выйдет

Нельзя использовать пакет менеджера геометрии внутри

ECDF в python без функции шага?

проблема кодирования в Python, когда urlopen () gbk-страница

Регистрация запрещенных исключений в Python

Python - лучший язык программирования в мире.