获取布尔lis中真值的索引

2024-05-21 07:50:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段代码要在其中创建一个交换机。我想返回所有开关的列表。这里“on”等于True,“off”等于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”


Tags: 代码inselffalsetruewhich列表for
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])

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

更有效的方法是使用np.where。请参阅下面的详细比较,可以看出np.where的性能优于itertools.compresslist comprehension

下面我比较了接受答案(@Ashwini Chaudhary)和使用numpy.where提出的解决方案。还要注意,在Python3中,不推荐使用xrange(),即xrange()从Python3.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
  • 方法1:使用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)
  • 方法2:使用itertools.compress
>>> %timeit list(compress(range(len(t)), t))
210 µs ± 704 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
  • 方法3(最快的方法):使用numpy.where
>>> %timeit np.where(t)
179 µs ± 593 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

相关问题 更多 >