2 回答

TA贡献1799条经验 获得超8个赞
我假设您的“术语”将按照您提供的示例所示的降序排列。我将简单地建立一个增量(例如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

TA贡献1895条经验 获得超7个赞
对于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]
添加回答
举报