在布尔列表中获取 True 值的索引

新手上路,请多包涵

我有一段代码,我应该在其中创建一个总机。我想返回所有打开的开关的列表。这里“开”等于 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”

原文由 Amon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

使用 enumeratelist.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

原文由 Ashwini Chaudhary 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果你有 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])

原文由 jterrace 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题