1

10 個の用語とそのスコアのリストがあります。最初の x は、残りの x よりもはるかに重要になる傾向があります。だから私はxを見つけたい。

たとえば、このリストをプロットすると、第 3 項の後にプラトーが表示されます。したがって、最初の 3 項を保持します。直感的にも、最初の 3 項を維持するのが適切に思えます。

    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

しかし、このカットオフをプログラムで生成する方法は? 私は標準ライブラリで利用可能なものを好みます。

4

2 に答える 2

2

あなたが提供した例に示すように、あなたの「用語」は降順でソートされると想定しています。無視できるほど小さい差を表すデルタ (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
于 2013-06-05T05:30:42.080 に答える
0

std-lib に適した方法として、 itertools.tee を使用してリスト内の項目を比較し、反復子のようにデルタを返すことができます。次に、itertools.takewhile を使用して、許容範囲内でデータを取得します。

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]
于 2013-06-05T07:05:07.437 に答える