0

私は15個の数字を持っています。

[1, 5, 10, 20, 30, 50, 70, 100, 150, 200, 500, 1000, 2000, 5000, 10000]

数量を入力する人がいますが、私が望むのは、最小数に丸めることです。したがって、誰かが入力36すると、 に丸められ30ます。

4

3 に答える 3

7

bisectO(log N)でそれを行います:

>>> import bisect
>>> L = [1, 5, 10, 20, 30, 50, 70, 100, 150, 200, 500, 1000, 2000, 5000, 10000]
>>> L[bisect.bisect(L, 36) - 1]
30

または純粋な python と O(N) の場合:

>>> L = [1, 5, 10, 20, 30, 50, 70, 100, 150, 200, 500, 1000, 2000, 5000, 10000]
>>> next(elem for elem in reversed(L) if elem <= 36)
30

Lリストがソートされていると仮定します。それ以外の場合L.sort()は前に。

于 2012-05-10T12:35:55.567 に答える
7

純粋な python の場合:

>>> numbers = [1, 5, 10, 20, 30, 50, 70, 100, 150, 200, 500, 1000, 2000, 5000, 10000]
>>> x = 36
>>> max(n for n in numbers if n <= x)
30

注:番号リストがソートされていることに依存しません。

于 2012-05-10T12:41:17.550 に答える
2

これが再帰的な解決策です。O(log n); である必要があります。リストがソートされているという事実に依存しています。

L = [1, 5, 10, 20, 30, 50, 70, 100, 150, 200, 500, 1000, 2000, 5000, 10000]

def roundit(x,n):
    if len(x) == 1:
        return x[0]
    elif x[len(x)/2] > n:
        return roundit(x[0:len(x)/2],n)
    else:
        return roundit(x[len(x)/2 :],n)

結果:

>>> roundit(L,36)
30
>>> roundit(L,77)
70
>>> roundit(L,150)
150
于 2012-05-10T13:00:53.723 に答える