这个怎么样?没有PHP,我已经使用Python,但我希望它很清楚。询问是否。
设ℓ为开头的值的个数,n为您想要削减的值。然后这个想法是找到最大的指数x这样nx小于l。然后,我们可以选择使用索引的项目是最接近的整数
ℓ - (ñ - 1)X - 1,ℓ - (ñ - 2)X - 1,...,ℓ - 1 X - 1,ℓ - 0 X - 1
它们间隔很好,偏向于列表末尾。
import math
def select_with_bias(s, n):
"""Select n values from the list s if possible, with bias to later values."""
l = len(s)
if l <= n:
return s[:] # List is short: return copy of whole list.
if n < 2:
return s[-n:] # If n is 1, last item only; if n is 0, empty list.
x = math.log(l - 1, n) # Shorthand for log(l - 1)/log(n)
result = []
for i in xrange(n - 1, -1, -1): # Loop from n-1 down to 0.
result.append(s[l - int(i ** x) - 1])
return result
(对于Python专家:这是不是做在Python中最惯用的方式,但我想让它那样清楚我可以给谁不知道的Python程序员。)
例如:
>>> select_with_bias(range(100), 10)
[19, 36, 51, 64, 75, 84, 91, 96, 98, 99]
>>> select_with_bias(range(100), 20)
[8, 15, 22, 29, 36, 42, 48, 54, 60, 65, 70, 75, 80, 84, 88, 91, 94, 97, 98, 99]
很容易尝试变化这种方法:这个想法是选择合适形状的曲线和规模,以适应列表的长度,所以你可以尝试不同曲线。我选择了一条多项式曲线,但如果这不适合你,你可以选择一个不同的曲线,例如指数曲线。
URL的2000个字符长度是由GET方法引起的吗?然后转换为使用POST代替 – ajreal 2010-11-26 13:24:30
@ajreal - 好主意,但由于技术原因,我无法使用它。 – manixrock 2010-11-26 16:37:42