2017-03-17 77 views
1

我正在写一个python脚本来查看排名表,其中几个季度的团队绩效排名与其他各种排名相比,从最近的回溯,就像在正整数的有序列表中查找最大的正数delta

 Latest ->          <- Earliest 
Team A: 10 10 12 12 13 13 13 14 15 14 16 13 11 15 14  
Team B: 14 14 15 16 15 7 14 14 15 10 22 15 15 11 16 

我想要的是每个团队在任何时间范围内最大的积极改善。我不希望是最低的绝对值最高点,所以对于一个团队,去

最大涨幅仅2中,即使最大的三角洲是12

在以上A的情况,最大的涨幅从本季的#16(7个季节前)到#10,而对于B,11到6个季度之前,涨幅最大的是从#22到#7。

我要循环像这样的列表,并返回像

Team A: 6 
Team B: 15 

东西,我可以弹出()每个赛季,和以前所有的季节减去它,然后保存最大正INT,但感觉马虎。 OTOH,排序列表并拉动第一个和最后一个元素会使排名下降。 (我只想衡量收益,而不是损失。)

有没有一种简单的方法可以在季节性能表现中找到最近的,良好的团队表现和更早的表现,表现更差的最大差距,没有这种循环?

+2

是它最大(A) - 分(A)是你想最大的区别? – Rednivrug

+0

* *粘土Shirky?对不起,无法抗拒 - 配置文件看起来像是,那一个。 – tripleee

+0

我不想要最大的绝对值,我想要最大的正值。 (球队在排名中上升的难度很大,但很容易下降。)所以我对从#22到#7的球队感兴趣,但不是从#7到#22的球队。 –

回答

1

您需要遍历列表,跟踪最小值和当前最大涨幅(这是current list member - min)。每次处理列表成员时,检查它是否为新分钟,并根据需要更新当前最大的分数。

你不需要从以前的所有季节中减去,你只需要检查新元素是否是新的最小值,以及它是否是最大涨幅。

Ex。

def find_max_pos_delta(my_scores): 
    my_list = map(int, my_scores.strip().split()) 
    my_min = current_largest = None 
    for rank in my_list: 
     if my_min is None or rank < my_min: 
      my_min = rank 
     new_largest = rank - my_min 
     if current_largest is None or new_largest > current_largest: 
      current_largest = new_largest 

    return current_largest 

assert find_max_pos_delta('30 18 20') == 2 
assert find_max_pos_delta('10 10 12 12 13 13 13 14 15 14 16 13 11 15 14 ') == 6 
assert find_max_pos_delta('14 14 15 16 15 7 14 14 15 10 22 15 15 11 16') == 15 

时间复杂度O(n),因为它在所有元素上循环。

请注意,我选择了颠倒目标和列表,但结果是相同的。即。我从本年度过去,但也从较高级别到较低级别。

+0

很好,非常感谢,当然这就是它 - 我错过了一个事实,即当我浏览列表时,随着当前最大范围的增长,我可以跳过越来越多的元素。再次感谢。 –

0

不是很漂亮,但我相信你可以找出最大的改进序列:

def find_greatest_rise(rank_list): 
    rank_list = rank_list[::-1] #reverse the rank list so we iterate moving forward in time 
    i = 0 
    if len(rank_list) > i + 1: 
     bottom = 0 
     top = 0 
     delta = 0 
     end_of_list = False 

     while not end_of_list: 
      curr_rank = rank_list[i] 
      for j, r in enumerate(rank_list[i + 1:]): 
       if curr_rank - r > 0: 
        if curr_rank - r >= delta: 
         delta = curr_rank - r 
         bottom = curr_rank 
         top = r 
       else: 
        i += j + 1 
        break 

       if j == len(rank_list[i + 1:]) - 1: 
        end_of_list = True 

     print "bottom: {}, top: {}, delta: {}".format(bottom, top, delta) 
相关问题