這個怎麼樣?沒有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