У меня есть часть моего кода, где я, как предполагается, создаю кнопочную форму. Я хочу возвратить список всех переключателей, которые работают. Здесь "на" будет равняться 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"
Намного более эффективный путь состоит в том, чтобы использовать 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
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)
>>> %timeit list(compress(range(len(t)), t))
210 µs ± 704 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
>>> %timeit np.where(t)
179 µs ± 593 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)