在布尔列表中获取True值的索引 [英] Getting indices of True values in a boolean list
问题描述
我有一段代码应该在其中创建总机.我想返回所有打开的开关的列表.此处"on"等于True
,"off"等于False
.所以现在我只想返回所有True
值及其位置的列表.这就是我所拥有的,但它只返回第一次出现的True
的位置(这只是我的代码的一部分):
I have a piece of my code where I'm supposed to create a switchboard. I want to return a list of all the switches that are on. Here "on" will equal True
and "off" equal False
. So now I just want to return a list of all the True
values and their position. This is all I have but it only return the position of the first occurrence of True
(this is just a portion of my code):
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"
推荐答案
使用enumerate
,list.index
返回找到的第一个匹配项的索引.
Use enumerate
, list.index
returns the index of first match found.
>>> 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
:
For huge lists, it'd be better to use 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
这篇关于在布尔列表中获取True值的索引的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!