【问题标题】:What is the fastest way to check if a number is in specific range in python?在python中检查一个数字是否在特定范围内的最快方法是什么?
【发布时间】:2016-04-22 18:27:53
【问题描述】:

我有 5 个范围:

1-50 ---> "range1"
51-100 ---> "range2"
101-150 ---> "range3"
151-200 ---> "range4"
201-250 ---> "range5"

范围不重叠,每个范围都有下限和上限,下一个范围从前一个结束的地方开始。我决定范围的长度。它们的大小可能不相等。

我有一个显示数字的变量,例如

x = 153

如果 x 介于 1 和 50 之间,那么它应该返回“range1”,如果介于 51 和 100 之间,那么它应该返回“range2”,以此类推。 考虑到可能有5个以上的范围,而且数量很大,在python中最快的方法是什么?

【问题讨论】:

  • 这些数字在某些已知范围内的可能性是否比在其他范围内的可能性高?
  • 不,这个数字可能在任何范围内,概率相等。
  • 如何获得这些范围?它们是数组中的 2 个整数吗?它们重叠吗?范围稀疏吗?
  • 它们不重叠,每个范围都有下限和上限,下一个范围从该范围结束的地方开始。我决定范围的长度。它们的大小可能不相等。

标签: python integer range


【解决方案1】:

因为您的范围严格相邻且按递增顺序排列,您可以使用二分法:

from bisect import bisect

ranges = [1, 51, 101, 151, 201]
if 0 < x <= 250:
    print('range{}'.format(bisect(ranges, x))
else:
    print('Out of bounds')

平分需要 O(logN) 步从 N 个可能性中找到匹配范围。

【讨论】:

  • 这仅在范围像这样相互对接时才有效...@alwbtc 是这种情况吗?
  • 这比使用传统的if 循环更快吗?
  • @karina 是的,他们互相反对。
  • @alwbtc:这是一个 O(logN) 解决方案,适用于 N 个范围。一个循环需要 O(N)。
猜你喜欢
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
相关资源
最近更新 更多