web-dev-qa-db-ja.com

数値を指定範囲内に制限する方法は? (Python)

数値を特定の範囲内に制限します。現在、私は次のことをしています:

minN = 1
maxN = 10
n = something() #some return value from a function
n = max(minN, n)
n = min(maxN, n)

これによりminNmaxN内に保持されますが、見た目はあまり良くありません。どうすればもっとうまくできますか?

PS:参考までに、私はPython 2.6。

41
Mantis Toboggan
def clamp(n, minn, maxn):
    return max(min(maxn, n), minn)

または機能的に同等:

clamp = lambda n, minn, maxn: max(min(maxn, n), minn)

今、あなたは使用します:

n = clamp(n, 7, 42)

または完全に明確にする:

n = minn if n < minn else maxn if n > maxn else n

さらに明確に:

def clamp(n, minn, maxn):
    if n < minn:
        return minn
    Elif n > maxn:
        return maxn
    else:
        return n
54
Adrien Plisson

キュートになりたい場合は、次のことができます。

n = sorted([minN, n, maxN])[1]
41
Steve Howard

単にnumpy.clip()を使用してください( doc ):

n = np.clip(n, minN, maxN)

また、配列全体に対しても機能します。

my_array = np.clip(my_array, minN, maxN)
40
Björn

クラスを定義し、それらの検証を実行する値を設定するメソッドを用意します。

漠然と以下のようなもの:

class BoundedNumber(object):
    def __init__(self, value, min_=1, max_=10):
        self.min_ = min_
        self.max_ = max_
        self.set(value)

    def set(self, newValue):
        self.n = max(self.min_, min(self.max_, newValue))

# usage

bounded = BoundedNumber(something())
bounded.set(someOtherThing())

bounded2 = BoundedNumber(someValue(), min_=8, max_=10)
bounded2.set(5)    # bounded2.n = 8
2
Platinum Azure

いくつかの1行のpython条件ステートメントをつなげることはできませんか?

0255の間のpixel値を制限する方法を探しているときにこの質問に出会いましたが、max()min()は非常に読みやすいため、次のfunctionを記述しました。

def clamp(x, minn, maxx):
   return x if x > minm and x < maxx else (minn if x < minn else maxx)

私は、私よりも経験豊富な人がこの価値観をどのように把握するかを知りたいと思っています。 min()max()を使用するよりも効率が悪いと思いますが、より読みやすい(少なくとも私には)function

0
Joe Iddon