Получение индексов Истинных значений в булевом списке

У меня есть часть моего кода, где я, как предполагается, создаю кнопочную форму. Я хочу возвратить список всех переключателей, которые работают. Здесь "на" будет равняться True и "от" равного 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"

60
задан 30 January 2014 в 09:16

1 ответ

Намного более эффективный путь состоит в том, чтобы использовать np.where . Посмотрите подробное сравнение ниже, где оно видно np.where, превосходит по характеристикам и itertools.compress и также list comprehension .

Ниже я сравнил решения, предложенные принятым ответом (@Ashwini Chaudhary) с использованием numpy.where. Также обратите внимание, что в Python 3, xrange () удерживается от использования, т.е. xrange () удален из Python 3.x.

>>> from itertools import compress
>>> import numpy as np
>>> t = [False, False, False, False, True, True, False, True, False, False, False, False, False, False, False, False]`
>>> t = 1000*t
  • Метод 1: Использование list comprehension
>>> %timeit [i for i, x in enumerate(t) if x]
457 µs ± 1.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
  • Метод 2: Используя [1 110]
>>> %timeit list(compress(range(len(t)), t))
210 µs ± 704 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
  • Метод 3 (самый быстрый метод): Используя [1 111]
>>> %timeit np.where(t)
179 µs ± 593 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
4
ответ дан 1 November 2019 в 09:54

Другие вопросы по тегам:

Похожие вопросы: