У меня есть фрагмент кода, в котором я должен создать коммутатор. Я хочу вернуть список всех включенных переключателей. Здесь «включено» будет равно, 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"
x
, затем делал,enumerate(x)
но я думаю, все, что я делал, это перечислял 4? Это то, что происходило? Спасибо за помощьi for i, x
в понимании списка? Я только привык видетьi for i
например или подобный формат, в чем функцияx
? Спасибоenumerate
возвращает набор кортежей (IND, значение) в течение цикла, теперь мы можем назначить пункты кортежа двух переменных с помощью:i, x = (ind, value)
. Именно это и происходит в этом цикле.itertools.compress
решении измените значениеxrange
наrange
. (xrange
был переименованrange
в Python 3.)Если у вас есть 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)[0] array([4, 5, 7])
источник
np.where(states)[0]
фактического использования результатовTL; ДР : используйте,
np.where
поскольку это самый быстрый вариант. Ваши вариантыnp.where
,itertools.compress
иlist comprehension
.Смотрите подробное сравнение ниже, где видно, что он
np.where
превосходит обаitertools.compress
и такжеlist comprehension
.>>> 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)
itertools.compress
>>> %timeit list(compress(range(len(t)), t)) 210 µs ± 704 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
numpy.where
>>> %timeit np.where(t) 179 µs ± 593 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
источник
Вы можете использовать для этого фильтр:
filter(lambda x: self.states[x], range(len(self.states)))
range
Здесь перебирает элементы списка и так как мы хотим только те , гдеself.states
естьTrue
, мы применяем фильтр , основанный на этом условии.Для Python> 3.0:
list(filter(lambda x: self.states[x], range(len(self.states))))
источник
Используйте способ понимания словаря,
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}
источник
Используя поэлементное умножение и набор:
>>> states = [False, False, False, False, True, True, False, True, False, False, False, False, False, False, False, False] >>> set(multiply(states,range(1,len(states)+1))-1).difference({-1})
Выход:
{4, 5, 7}
источник
Просто сделайте это:
def which_index(self): return [ i for i in range(len(self.states)) if self.states[i] == True ]
источник