我有一个包含二进制信息的python列表,其序列为1或序列为0,例如:
event = [0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1]
如何存储起始1和结束1的索引值?
例如:
如果event = [0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1]
则result = [2,5,8,11]
EDIT2 我意识到理想情况下结果应该是result_start = [2,8] result_end = [5,11],就像lazyr解决方案一样,这样我们就能理解单个1所在的位置。例如。 event = [0,0,1,1,0,1],会产生最后一个错误的列表1.感谢你们全力以赴!
EDIT1:我需要第一个和最后一个1的索引,但首先是最后一个索引。
我尝试将其编码如下:
k=False
j=0
result=[]
for i in event:
if i==1:
k=True
result.append(k)
else:
k=False
答案 0 :(得分:3)
event = [0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1,
1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1]
from itertools import izip_longest
def pair_iterator(event):
event = [0] + event
return enumerate(izip_longest(event, event[1:], fillvalue=0), -1)
def one_ranges(event):
start = [i + 1 for i, pair in pair_iterator(event) if pair == (0, 1)]
end = [i for i, pair in pair_iterator(event) if pair == (1, 0)]
return zip(start, end)
print one_ranges(event)
修改强>
还可以找到从索引0开始的范围。
创建one_ranges
函数,该函数返回(start, end)
元组列表。
答案 1 :(得分:1)
当我看到你真正想要的东西时,你可以做这样的事情:
result = []
is_one = False
for i in range(len(event)):
if not is_one and event[i] == 1: #Starting chain of ones
is_one = True
result.append(i)
elif is_one and event[i] == 0: #Finished a chain of ones
is_one = False
result.append(i-1)
if is_one: #The list finished with a chain of ones
result.append(len(event)-1)
答案 2 :(得分:1)
>>> event = [0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1]
>>> event = [0] + event + [0]
>>> [i-1 for i in xrange(1,len(event)-1) if event[i]==1 and (event[i+1]==0 or event[i-1]==0)]
[2, 5, 8, 11]
我们在前面添加并附加列表,以确保我们在列表的开头和/或结尾找到ones
的边角情况。