オーバーラップのない単調:
このバージョンは、単調なシーケンスを検出し、オーバーラップを登録しません。最初に注意を払わなかったことをお詫びします。
def find_sequences(lst, min_len=3):
curr = []
asc = None
for i in lst:
if not curr or len(curr) == 1 or asc and i >= curr[-1] or not asc and i <= curr[-1]:
if len(curr) == 1:
asc = curr[-1] < i
curr.append(i)
else:
if len(curr) >= min_len:
yield curr
asc = None
curr = [i]
if len(curr) >= min_len:
yield curr
収量:
[[0, 1, 3, 8, 10, 13, 13], [11, 5, 1, 0]]
パフォーマンスで:
In [6]: timeit list(find_sequences(x))
100000 loops, best of 3: 8.44 µs per loop
オーバーラップのある単調/非単調:
この関数は、単調で重複するシーケンスを見つけます。を と に>=
それぞれ変更することで非単調に動作するように簡単に変更できます。また、パラメーター化することもできます。<=
>
<
def find_sequences(lst, min_len=3):
asc, desc = [], []
for i in lst:
if not asc or i >= asc[-1]:
asc.append(i)
else:
if len(asc) >= min_len:
yield asc
asc = [i]
if not desc or i <= desc[-1]:
desc.append(i)
else:
if len(desc) >= min_len:
yield desc
desc = [i]
if len(desc) >= min_len:
yield desc
if len(asc) >= min_len:
yield asc
収量:
[[0, 1, 3, 8, 10, 13, 13], [13, 13, 8, 4], [11, 5, 1, 0]]
パフォーマンスで:
In [3]: timeit list(find_sequences(x))
100000 loops, best of 3: 10.5 µs per loop