2017-03-17 61 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) 
相關問題