python中整数的取值范围_如何钳位一个整数的一些范围? (在Python中)

本文探讨了在Python中限制整数索引值以保持在列表范围内的一系列方法,包括使用if语句、max()和min()函数组合、numpy.clip以及自定义函数。比较了不同方法的简洁性和性能,推荐使用max()和min()结合的方式,同时提供了可读性更好的函数封装建议。
摘要由CSDN通过智能技术生成

如何钳位一个整数的一些范围? (在Python中)

我有以下代码:

new_index = index + offset if new_index < 0: new_index = 0 if new_index >= len(mylist): new_index = len(mylist) - 1 return mylist[new_index]

基本上,我计算一个新的索引,并使用它从列表中find一些元素。 为了确保索引在列表的范围内,我需要将这2个if语句分成4行。 这是非常冗长的,有点丑陋…我敢说,这是非pythonic 。

还有其他更简单更紧凑的解决scheme吗? (和更pythonic )

是的,我知道我可以在一行中使用,但它不可读:

new_index = 0 if new_index < 0 else len(mylist) - 1 if new_index >= len(mylist) else new_index

我也知道我可以连接max()和min() 。 它更紧凑,但是如果我input错误的话,我觉得它有点模糊,更难find错误。 换句话说,我不觉得它很直接。

new_index = max(0, min(new_index, len(mylist)-1))

实际上这很清楚。 很多人很快学会了。 您可以使用评论来帮助他们。

new_index = max(0, min(new_index, len(mylist)-1))

sorted((minval, value, maxval))[1]

例如:

>>> minval=3 >>> maxval=7 >>> for value in range(10): ... print sorted((minval, value, maxval))[1] ... 3 3 3 3 4 5 6 7 7 7

看numpy.clip :

index = numpy.clip(index, 0, len(my_list) - 1)

这里有很多有趣的答案,除了…哪个更快?

import numpy np_clip = numpy.clip mm_clip = lambda x, l, u: max(l, min(u, x)) s_clip = lambda x, l, u: sorted((x, l, u))[1] py_clip = lambda x, l, u: l if x < l else u if x > u else x

>>> import random >>> rrange = random.randrange >>> %timeit mm_clip(rrange(100), 10, 90) 1000000 loops, best of 3: 1.02 µs per loop >>> %timeit s_clip(rrange(100), 10, 90) 1000000 loops, best of 3: 1.21 µs per loop >>> %timeit np_clip(rrange(100), 10, 90) 100000 loops, best of 3: 6.12 µs per loop >>> %timeit py_clip(rrange(100), 10, 90) 1000000 loops, best of 3: 783 ns per loop

paxdiablo有它!,使用普通的醇'python。 这个numpy版本,也许并不奇怪,是最慢的。 可能是因为它正在寻找数组,其他版本只是在排列他们的参数。

链接max()和min()在一起是我见过的普通习惯用法。 如果你觉得很难阅读,写一个帮助函数来封装操作:

def clamp(minimum, x, maximum): return max(minimum, min(x, maximum))

无论发生在我心爱的可读Python语言上? 🙂

认真地说,只是使其function:

def addInRange (val, add, minval, maxval): newval = val + add if newval < minval: return minval if newval > maxval: return maxval return newval

然后只需要像这样调用它:

val = addInRange (val, 7, 0, 42)

或者是一个更简单,更灵活的解决scheme,您可以自己进行计算:

def restrict (val, minval, maxval): if val < minval: return minval if val > maxval: return maxval return val x = restrict (x+10, 0, 42)

如果你想,你甚至可以使最小/最大的列表,所以看起来更“math纯”:

x = restrict (val+7, [0, 42])

如果你的代码太笨拙了,一个函数可能会有所帮助:

def clamp(minvalue, value, maxvalue): return max(minvalue, min(value, maxvalue)) new_index = clamp(0, new_index, len(mylist)-1)

避免为这样的小任务编写函数,除非你经常应用它们,因为它会混淆你的代码。

对于个人价值观:

min(clamp_max, max(clamp_min, value))

对于值列表:

map(lambda x: min(clamp_max, max(clamp_min, x)), values)

这个对我来说似乎更加pythonic:

>>> def clip(val, min_, max_): ... return min_ if val < min_ else max_ if val > max_ else val

一些testing:

>>> clip(5, 2, 7) 5 >>> clip(1, 2, 7) 2 >>> clip(8, 2, 7) 7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值