我列出了10个条款及其分数。第一个x往往比其他x重要得多。所以我想找到x。
例如,plotting this list显示第三个学期后的平台。因此我们保留前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
但是如何以编程方式生成此截止 ?我更喜欢标准库中提供的东西。
答案 0 :(得分:2)
我假设您的“条款”将按降序排序,如您提供的示例所示。我只想建立一个delta(比如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
答案 1 :(得分: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]