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
def get_monotonic_subsequences(data, min_length):
direction = data[1] - data[0] #determine direction of initial subsequence
subsequences = []
cur_seq = []
for i in range(0, len(data) - 1):
if direction > 0:
if (data[i] >= data[i-1]):
cur_seq.append(data[i])
else:
subsequences.append(cur_seq)
cur_seq = [data[i]]
direction = data[i+1] - data[i]
else:
if (data[i] <= data[i-1]):
cur_seq.append(data[i])
else:
subsequences.append(cur_seq)
cur_seq = [data[i]]
direction = data[i+1] - data[i]
if (data[-1] - data[-2])*direction > 0:
cur_seq.append(data[-1])
subsequences.append(cur_seq)
else:
subsequences.append(cur_seq)
subsequences.append([data[-1]])
return [x for x in subsequences if len(x) >= min_length]
单调无重叠:
这个版本发现单调序列,不注册重叠;抱歉没有注意到最初。你知道吗
收益率:
性能:
单调/非单调重叠:
此函数用于查找单调和重叠序列;您可以通过将
>=
和<=
分别更改为>
和<
来轻松地将其更改为非单调工作,甚至可以将其参数化。你知道吗收益率:
性能:
下面的方法应该有用。。。它将数据分解为不相交的单调子序列,然后根据长度标准进行过滤。你知道吗
另一方面,您的问题还不清楚,但是您的输出表明您希望从左到右贪婪地收集子序列,这是代码假定的。你知道吗
相关问题 更多 >
编程相关推荐