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