获取二进制列表中以0或1序列开始和结束的1的索引

2024-09-25 00:22:53 发布

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

我有一个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\u start=[2,8]result\u end=[5,11],就像lazyr解一样,这样我们就知道了一个1的位置。例如,event=[0,0,1,1,0,1],将为最后一个1生成一个错误的列表。谢谢大家的努力!你知道吗

编辑1:我需要第一个和最后一个1的索引,但是从第一个到最后一个1。你知道吗

我试着像下面这样编码:

k=False
j=0
result=[]
for i in event:
   if i==1:
       k=True
       result.append(k)
   else:
       k=False      

Tags: event信息false列表错误二进制情况序列
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)元组列表。你知道吗

我知道你真正想要的是你可以这样做:

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)
>>> 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的角大小写。你知道吗

相关问题 更多 >