1

我有一个包含 10 个术语及其分数的列表。第一个 x 往往比其他 x 重要得多。所以我想找到x。

例如,绘制此列表会显示第三个任期后的平稳期。因此,我们保留前 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”中看到一个术语,我将结束我的迭代并可能从我的结果集合中删除最后一个看到的术语出色地。

那有意义吗?

看起来像这样的东西:

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