我只想返回所有第一个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]
有办法吗?
答案 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))]