コードの一部に、スイッチボードを作成する部分があります。オンになっているすべてのスイッチのリストを返したいです。ここで、「オン」は に等しく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」のみを返します
ベストアンサー1
を使用すると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