获得具有0或1的序列的二进制列表的开始和结束1的索引

时间:2012-05-14 12:16:37

标签: 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_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      

3 个答案:

答案 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的边角情况。