1

たとえば、1のシーケンスまたは0のシーケンスを持つバイナリ情報を含むpythonリストがあります。

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のインデックスが必要ですが、最初から最後の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
>>> 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 に答える