2013-06-05 48 views
1

我有他們的分數10個術語的列表。第一個x往往比其他要重要得多。所以我想找到x。如何「切斷一個系列的尾巴」

例如,plotting this list在第三學期後顯示一個高原。因此我們保留前三項。即使直覺上,保持前三項似乎也是適當的。

badge         => 7.00709342956543 
    unlocked        => 7.00709342956543 
    foursquare        => 5.830315748850505 
    https         => 5.001254081726074 
    you've unlocked       => 4.954763253529866 
    50xxxxxx badge       => 4.954763253529866 
    all badges        => 4.954763253529866 
    unlocked far       => 4.954763253529866 
    badges         => 4.954763253529866 
    just unlocked       => 4.954763253529866 

但如何產生這個截止編程?我更喜歡標準庫中提供的東西。

+0

所以,我想一種方法是abs()的差異,以降序排列結果列表的差異。設置你的「閾值」差異(比如2.5),忽略與列表中的任何差異<2.5。 –

回答

2

我假設您的「條款」將按照您提供的示例中所示的降序排序。我會簡單地建立一個代表小到可以忽略的差異的delta(比如0.5)。

然後,我會遍歷術語集合,添加它們的結果集合,一旦我在先前看到的術語的「三角洲」內看到一個術語,我將結束我的迭代並可能刪除最後一次看到的術語我的收藏也是如此。

這有道理嗎?

的東西,看起來像這樣:

delta = 0.5 
result = [] 
for term in termMapSortedKeys: 
    if (previousTermValue - delta >= termMap[term]): 
      break 
    else: 
      result.append(term) 
      previousTermValue = termMap[term] 
del result[-1] 
return result 
+1

如果你想要更多的條款,我會建議做這個項目和列表中的'k'之間的增量。這樣,你不能停止平局,但是一旦名單停止增長,它仍會停止。 – btilly

+0

@btilly:你絕對正確!也許,以相反的方向遍歷列表(按照期限值的升序)更有意義。只要遇到值> previousTermValue + delta的項,就開始記錄項目。我認爲這種方法最大的缺點是你最終會在閱讀一大堆垃圾之前就讀完。 –

0

對於STD-lib中友好的方式,你可以使用itertools.tee做的項目之間的比較列表,並返回三角洲作爲迭代器。然後使用itertools.take同時獲取容差範圍內的數據。

import itertools, sys 

def delta(data): 
    '''yield the original data and the delta to the next item as tuple''' 
    a, b = itertools.tee(data) 
    yeild (next(b, None), sys.maxint) # assume the first item always passes :) 
    for n in itertools.izip(a, b): 
     yield n[1], abs(n[1] - n[0]) 


# example... 
data = [0,1,2,3,4,6,6.125,6.25,6.375,6,6,6.25,5,6,6, 4.5, 2.5, 7] 
data.sort()  
print data 
# [0, 1, 2, 2.5, 3, 4, 4.5, 5, 6, 6, 6, 6, 6, 6.125, 6.25, 6.25, 6.375, 7] 


filter_fn = lambda x: x[1] > .05 # tolerance goes here... 
trimmed = [item[0] for item in itertools.takewhile(filter_fn , delta(data))] 
print trimmed 
# [0, 1, 2, 2.5, 3, 4, 4.5, 5, 6]