python列表中的迭代与比较

python列表中的迭代与比较,python,python-3.x,list,algorithm,Python,Python 3.x,List,Algorithm,我有一份价值清单(清单的顺序很重要): 我的目标是找到最重要的损失。例如,在上面的列表中,最重要的损失是4,因为7-3=4 我如何迭代一个列表,以便如果lst[x]>lst[x+1]我继续下一个列表 换句话说,我在寻找列表后面的较大元素和较小元素之间的最大差异。要获得连续元素之间的最大减少量,这并不漂亮,但我们可以对进行如下循环: data = [7, 5, 3, 4, 6, 4, 7] largestDrop = 0 currentDrop = 0 previousValue = None

我有一份价值清单(清单的顺序很重要):

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

我如何迭代一个列表,以便如果
lst[x]>lst[x+1]
我继续下一个列表


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

要获得连续元素之间的最大减少量,这并不漂亮,但我们可以对
进行如下循环:

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

这里有一个蛮力方法:

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

其思想是将每个数字和随后的每个数字成对地计算差异,然后取这些差异的最大值。如上所述使用生成器表达式意味着在此过程中不构建中间列表。

您将损失定义为元素
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

这可以通过第三方库使用矢量化逻辑
numpy

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

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

这不适用于所有数据集,我正在尝试调试它。谢谢你的帮助help@remc什么不起作用?提供输入输出的详细信息和示例。我读到你的另一个解决方案需要大量内存,这个解决方案在时间上应该是O(n),在内存上应该是O(1)。@OlivierMelançon事实上,它完全可以工作!谢谢你的帮助:D
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