python中每个第一个真值的索引

时间:2019-03-11 13:37:35

标签: python python-3.x

我只想返回所有第一个True值及其位置的列表。在这里,“开”等于True,“关”等于False

t = [False, False, False, False, True, True, True, False, False,
     True, True, True, True, False, False, False, False, False,
     False, False, True, True, True, False]

答案应为列表

[4, 9, 20]

我尝试了以下代码:

[i for i, x in enumerate(t) if x]

这将返回

[4, 5, 6, 9, 10, 11, 12, 20, 21, 22]

有办法吗?

5 个答案:

答案 0 :(得分:2)

ret = []
prev = False
for i, x in enumerate(t):
    if x and not prev:
        ret.append(i)
    prev =  x
print(ret)

答案 1 :(得分:0)

t = [False, False, False, False, True, True, True, False, False,
     True, True, True, True, False, False, False, False, False,
     False, False, True, True, True, False]

indexes = []

counter = 0
for i in range(0, len(t)):
    el = t[i]
    if counter == 0:
        if el:
            indexes.append(i)
            counter = i
    else:
        if (el == True) and (i - counter == 1):
            indexes.append(i)
            counter = i
        else:
            break
print(indexes)

答案 2 :(得分:0)

如果您对第三方模块pandas没问题

import pandas as pd
t = [False, False, False, False, True, True, True, False, False,
     True, True, True, True, False, False, False, False, False,
     False, False, True, True, True, False]
s=pd.Series(t)
s = s.loc[s==True][s.shift(+1) != s]

另一种没有使用defaultdict的熊猫的解决方案

from collections import defaultdict
d=defaultdict(list)
prev=t[0]
d[prev].append(0)
for idx,element in enumerate(t[1:],1):

    if element!=prev:
        d[element].append(idx)
        prev=element
print(d)

输出:

defaultdict(list, {False: [0, 7, 13,23], True: [4, 9, 20]})

答案 3 :(得分:0)

如果您想要单线:

on_list = [i for i, x in enumerate(t) if x and not (i and t[i-1])]
print(on_list)

但是,在这种情况下,没有理由使用单线使其太复杂而难以阅读。

答案 4 :(得分:-1)

您快到了:

[i for i, x in enumerate(t) if x and x != t[i-1]]

发表好评论后进行编辑:(我的意思是,它仍然可以是单行的)

[i for i, x in enumerate(t) if x and (x != (t[i-1] if i > 0 else False))]