【问题标题】:How to find and print the trend point change如何查找和打印趋势点变化
【发布时间】:2019-09-05 18:52:26
【问题描述】:

我正在研究的逻辑:

我正在尝试打印更改点的结果。

趋势变化点是数组改变其方向并从递增到递减或从递减到递增顺序的那些点。

我应该得到:11 8 5 10,但我只得到了一部分。 **我的方法是正确的方法吗?*

numberss = [1,4,9,11,8,3,2,5,10]
trendpoints(numberss,len(numberss))

def trendpoints(number_array, length):
    print("length", length)
    print(number_array)
    # -1 on the array because we dont need to jump to the last number (fake fix)
    for num in range(1, length-1):
        # check last, current and next
        # if current greater then current and less then next
        # [1,4,9,11,8,3,2,5,10]
        # 11 hit 8 CHANGE UP print both
        if num <= length:
            #print(number_array[num-1])
            #print(number_array[num])
            #print(number_array[num+1])

            # 9 11 8
            # 11 > 9
            # 11 < 8

            # 2 5 10
            # 2 < 5
            # 10 > 5
            if ((number_array[num] > number_array[num-1] and number_array[num] > number_array[num+1])
                or (number_array[num] < number_array[num-1] and number_array[num] > number_array[num+1])):
                #print("CHANGE")
                print(number_array[num])
                #print(number_array[num+1])
            print("---")

我的结果:

length 9
[1, 4, 9, 11, 8, 3, 2, 5, 10]
---
---
11
---
8
---
3
---
---
---

【问题讨论】:

  • 为什么 8 和 10 包含在您的预期结果中?它从增加变为减少(和相反)的唯一 2 次是 11 和 2。

标签: python arrays python-3.x arraylist


【解决方案1】:

如 cmets 中所述,11 和 2 是唯一预期的解决方案。这是使用列表推导的简短解决方案:(假设没有重复数字)

def trendpoints(number_array, length):
    diff_array = [number_array[i] - number_array[i - 1] for i in range(1, length)]
    trend_array = [number_array[i] for i in range(1, length - 1) if diff_array[i] * diff_array[i - 1] <= 0]
    return trend_array

【讨论】:

    【解决方案2】:

    这实际上是一种微积分问题。在微积分中,当父函数在任一方向上的导数的输入产生具有相反符号的输出时,定义局部最小值或最大值(当导数等于 0 时定义所有极值,但也包括'不一定是局部最小值/最大值)。

    在这种情况下,您可以从当前值中减去任一侧的值,如果它们的符号相反,则为最小值或最大值。

    for i, v in enumerate(numberss):
        ldiff = 0
        if i > 0:
            ldiff = v-numerberss[i-1]
        rdiff = 0
        if i < len(numberss)-1:
            rdiff = numberss[i+1]-v
         # if they're opposite signs, ldiff*rdiff is < 0
        is_extrema = ldiff*rdiff < 0
    

    fendall 的回答提供了一种使用列表推导式表达这一点的更 Pythonic 的方式。

    【讨论】:

      猜你喜欢
      • 2017-10-28
      • 2013-07-21
      • 1970-01-01
      • 2012-05-08
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 2021-07-15
      相关资源
      最近更新 更多