我有一个值列表(列表的顺序很重要):
[7, 5, 3, 4, 6, 4, 7]
我的目标是找到最重要的损失。例如,在上面的列表中,最重要的损失是4
,因为7 - 3 = 4
。
如何迭代列表,以便list[x] > list[x + 1]
我继续下一个?
答案 0 :(得分:-1)
要在连续元素之间获得最大的减少,它并不漂亮,但我们可以像这样进行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
答案 1 :(得分:-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
答案 2 :(得分:-2)
这是一种蛮力方法:
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
这个想法是成对地取每个数字和每个后续数字,计算差异,然后取这些差异的最大值。使用上面的生成器表达式意味着在该过程中不会构建中间列表。
答案 3 :(得分:-2)
通过第三方库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