1

我有一个带有二进制信息的 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],就像lazr 解决方案一样,这样我们就可以了解只有一个 1 所在的位置。例如。event=[0,0,1,1,0,1],会为最后一个 1 生成错误的列表。感谢您尝试所有!

EDIT1:我需要第一个和最后一个 1 的索引,但从第一个到最后一个 1。

我尝试将其编码如下:

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

3 回答 3

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)元组列表的函数。

于 2012-05-14T12:47:08.440 回答
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)
于 2012-05-14T12:19:33.720 回答
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开头和/或结尾的极端情况。

于 2012-05-14T12:53:54.780 回答