热线电话:13121318867

登录
2019-02-14 阅读量: 690
如何有效地找到最小长度的峰值?

我有整数的列表/数组,如果它上升然后下降,则将子数组称为峰值。例如:

[5,5,4,5,4]

包含

[4,5,4]

这是一个高峰期。

还考虑一下

[6,5,4,4,4,4,4,5,6,7,7,7,7,7,6]

其中包含

[6,7,7,7,7,7,6]

这是一个高峰期。

问题

给定一个输入列表,我想找到其中包含的最小长度的所有峰值并报告它们。在上面的示例中,[5,6,7,7,7,7,7,6]也是一个峰值,但我们删除了第一个元素,它仍然是一个峰值,所以我们不报告它。

所以对于输入列表:

L = [5,5,5,5,4,5,4,5,6,7,8,8,8,8,8,9,9,8]

解决办法:

运用 itertools

这是一个itertools.groupby用于检测峰值的简短解决方案。然后解包识别峰的组以产生实际序列。

from itertools import groupby, islice

l = [1, 2, 1, 2, 2, 0, 0]

fst, mid, nxt = groupby(l), islice(groupby(l), 1, None), islice(groupby(l), 2, None)

peaks = [[f[0], *m[1], n[0]] for f, m, n in zip(fst, mid, nxt) if f[0] < m[0] > n[0]]

print(peaks)

42.8571
4
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子