Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何";“剪掉尾巴”;连载_Python_Algorithm - Fatal编程技术网

Python 如何";“剪掉尾巴”;连载

Python 如何";“剪掉尾巴”;连载,python,algorithm,Python,Algorithm,我有一张10个术语的清单,上面有它们的分数。第一个x往往比其他x重要得多。所以我想找到x 例如,显示第三个术语后的平台。因此,我们保留前3个条款。即使从直觉上看,保留前3个术语似乎也是合适的 badge => 7.00709342956543 unlocked => 7.00709342956543 foursquare

我有一张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
但是如何以编程方式生成此截止点?我更喜欢标准库中提供的内容。

我假设您的“术语”将按降序排序,如您提供的示例所示。我只需要建立一个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

对于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]

所以,我想一种方法是对术语的差异进行abs(),按降序排列产生的差异列表。设置您的“阈值”差异(比如2.5),忽略列表中<2.5的任何差异。如果您想要更多术语,我建议将此项与
k
项之间的差值设置在列表下方。这样一来,你就不能在平局时止步,但一旦名单停止增长,你仍然会止步。@b蒂莉:你完全正确!也许,以相反的方向遍历列表(术语值的升序)更有意义。一旦遇到value>previousTermValue+delta的术语,就开始记录这些项。我想这种方法最大的缺点是,你在吃到肉之前会读一大堆垃圾。