【问题标题】:Iteration and comparison in python list [closed]python列表中的迭代和比较[关闭]
【发布时间】:2018-05-24 21:49:59
【问题描述】:

我有一个值列表(列表的顺序很重要):

lst = [7, 5, 3, 4, 6, 4, 7] 

我的目标是找到最重要的损失。例如,在上面的列表中,最重要的损失是4,因为7 - 3 = 4

我怎样才能迭代一个列表,以便如果lst[x] > lst[x + 1] 我继续下一个?

换句话说,我正在寻找列表中较大元素和较小元素之间的最大差异。

【问题讨论】:

    标签: python python-3.x list algorithm


    【解决方案1】:

    您将损失定义为元素 l[i] - l[i+x] 之间的差异,其中 l[i:i+x+1] 是递减子序列。

    然后我们可以遍历列表,在每个递减子序列上都有一个损失计数器,保持最大损失。

    from itertools import chain
    from math import inf
    
    def max_loss(l):
        a, b, max_loss = iter(l), chain(l, (inf,)), 0
        top = next(b, None)
    
        for prev, curr in zip(a, b):
            if curr > prev:
                max_loss, top = max(top - prev, max_loss), curr
    
        return max_loss
    

    例子:

    l = [7, 5, 3, 4, 2, 6, 4, 7]
    loss = max_loss(l)
    loss # 4
    

    【讨论】:

    • 这不适用于每个数据集,我正在尝试调试它。感谢您的帮助
    • @remc 什么不起作用?提供输入输出的详细信息和示例。我读过你的其他解决方案需要大量内存,这个应该是时间 O(n) 和内存 O(1)。
    • @OlivierMelançon 事实上,它工作得很好!感谢您的帮助:D
    【解决方案2】:

    为了在连续元素之间获得最大的减少,它并不漂亮,但我们可以像这样创建一个for 循环:

    data = [7, 5, 3, 4, 6, 4, 7]
    
    largestDrop = 0
    currentDrop = 0
    previousValue = None
    
    for currentValue in data:
        if previousValue != None and previousValue >= currentValue:
            currentDrop += previousValue - currentValue
        else:
            currentDrop = 0
    
        if currentDrop > largestDrop:
            largestDrop = currentDrop
    
        previousValue = currentValue
    

    【讨论】:

      【解决方案3】:

      这是一个蛮力方法:

      A = [7, 5, 3, 4, 6, 4, 7]
      
      res = max(A[j] - A[i] for i in range(len(A)) for j in range(i, len(A)))
      
      print(res)  # 4
      

      这个想法是成对地取每个数字和每个后续数字,计算差异,然后取这些差异中的最大值。使用上面的生成器表达式意味着过程中没有构建中间列表。

      【讨论】:

        【解决方案4】:

        这可以通过第 3 方库 numpy 使用矢量化逻辑实现。

        这个想法是使用broadcasting 来获取数组与其转置表示之间的差异。然后从结果数组中取下三角形的最大值。

        import numpy as np
        
        A = np.array([7, 5, 3, 4, 6, 4, 7])
        
        B = A - A[:, None]
        res = np.max(B[np.tril_indices(B.shape[0])])
        
        print(res)
        4
        

        【讨论】: