python列表

时间:2018-05-24 21:49:59

标签: python python-3.x list

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

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

我的目标是找到最重要的损失。例如,在上面的列表中,最重要的损失是4,因为7 - 3 = 4。 如何迭代列表,以便list[x] > list[x + 1]我继续下一个?

4 个答案:

答案 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