如何将数字限制在指定范围内? (Python)

Posted

技术标签:

【中文标题】如何将数字限制在指定范围内? (Python)【英文标题】:How to limit a number to be within a specified range? (Python) 【发布时间】:2011-08-25 05:01:41 【问题描述】:

我想将一个数字限制在一定范围内。目前,我正在执行以下操作:

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。

【问题讨论】:

How to clamp an integer to some range? (in Python)的可能重复 【参考方案1】:

如果你想变得可爱,你可以这样做:

n = sorted([minN, n, maxN])[1]

【讨论】:

这需要比其他方法更多的比较。 这就是为什么我称它为“可爱”而不是“实用”。 ;) 但是,在大多数情况下,这段代码的低效率不太可能导致有意义的性能问题。 哇,真可爱!我也喜欢它在 minN 和 maxN 互换下的不变性。这绝对是我最喜欢的钳位功能。 +1 ^_^ 如果有人对哪个版本运行更快感兴趣:两者都很快,但min(max(...)...) 大约快 1.4 倍。详细信息:python -m timeit -s "min_n = 10; max_n = 15" "for x in range(30): max(min(x, max_n), min_n)":7.28 微秒/循环。 python -m timeit -s "min_n = 10; max_n = 15" "for x in range(30): sorted([min_n, x, max_n])[1]":每个循环 10.2 微秒。 "min_n = 1000; max_n = 15000" "for x in range(-15000, 30000): ...":每循环 11 毫秒,"min_n = 1000; max_n = 15000" "for x in range(-15000, 30000): ...":每循环 14.8 毫秒【参考方案2】:
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

【讨论】:

def clamp(n, minn, maxn): return min(max(n, minn), maxn) 使用相同顺序的参数略微提高了可读性。 最快的解决方案(至少在我针对更具可读性的竞争者np.clip() 对多个单个随机值进行的测试中)。【参考方案3】:

定义一个类并有一个方法来设置执行这些验证的值。

大致如下:

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

【讨论】:

嗯,这是额外的开发时间来创建,但它是如此可重用! :-P 我相信它甚至可以扩展为检查无效的输入数字,如 NaN 或 +/-inf。 是的,当然它也可以配置为具有不同的边界。 :-) 它可以插入用户界面进行自动输入验证!可能性是无穷无尽的……您绝对应该为这样的发明申请专利。 谢谢。 Downvoter:是因为这感觉不是很“Pythonic”,还是你对我的回答有实际问题?【参考方案4】:

只需使用numpy.clip() (doc):

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

它也适用于整个数组:

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

【讨论】:

谢谢。尝试不编写自定义计算两次并且不想编写我自己的函数时,有一段很长的时间。 :-)【参考方案5】:

你能不能把一些单行的python条件语句串起来?

我在寻找将pixel 值限制在0255 之间的方法时遇到了这个问题,并且不认为使用max()min() 可读性很强,所以写了以下@ 987654327@:

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

我很想看看比我更有经验的人如何找到这种限制值的方法。我认为它一定比使用min()max() 效率低,但它可能对寻找更具可读性的人有用(至少对我而言)function

【讨论】:

以上是关于如何将数字限制在指定范围内? (Python)的主要内容,如果未能解决你的问题,请参考以下文章

在arcGIS中,如何实现将指定范围内的地图资料输出为shp档案

Python列表如何识别给定数字在挑战问题范围内[关闭]

如何将神经网络的输出限制在特定范围内?

将 UITextField 限制在某个字符范围内

如何将 F# 中的模块导入限制在本地范围内?

如何将可拖动的 UIView 限制在特定范围内