interval 模块是一个用于处理区间的第三方库,它非常强大,能够帮助你创建、合并、相交、相减区间,并能高效地判断一个值是否落在任何一个区间内,这在处理时间表、范围查询、数据分析等场景中非常有用。

安装
你需要安装这个模块,打开你的终端或命令行,运行以下命令:
pip install interval
核心概念:interval 对象
interval 模块的核心是 interval 类,一个 interval 对象代表一个连续的范围。
创建区间
创建区间最常用的方法是使用 interval() 函数,它接受两个参数:start(开始)和 end(结束)。
-
闭区间:默认情况下,区间是闭区间,包含边界值。
(图片来源网络,侵删)import interval as iv # 创建一个从 1 到 5 的闭区间 [1, 5] a = iv.interval(1, 5) print(a) # 输出: [1,5]
-
开区间:你可以通过设置参数来创建开区间,不包含边界值。
open_left=True: 左开区间,如 (1, 5]open_right=True: 右开区间,如 [1, 5)open_left=True, open_right=True: 全开区间,如 (1, 5)
# 创建一个左开区间 (1, 5] b = iv.interval(1, 5, open_left=True) print(b) # 输出: (1,5] # 创建一个全开区间 (1, 5) c = iv.interval(1, 5, open_left=True, open_right=True) print(c) # 输出: (1,5)
-
无穷区间:你可以使用
float('-inf')和float('inf')来创建无限的区间。# 创建一个从负无穷到 10 的区间 (-∞, 10] d = iv.interval(float('-inf'), 10) print(d) # 输出: [-inf,10] # 创建一个从 5 到正无穷的区间 [5, ∞) e = iv.interval(5, float('inf')) print(e) # 输出: [5,inf]
区间的包含关系
你可以使用 in 关键字来判断一个值是否在区间内。
a = iv.interval(1, 5) print(3 in a) # 输出: True print(1 in a) # 输出: True (闭区间包含边界) print(5 in a) # 输出: True (闭区间包含边界) print(0 in a) # 输出: False print(6 in a) # 输出: False b = iv.interval(1, 5, open_left=True, open_right=True) print(1 in b) # 输出: False (开区间不包含边界) print(5 in b) # 输出: False (开区间不包含边界)
集合操作:IntervalSet
在实际应用中,我们通常需要处理多个不连续的区间集合,上午9点到11点”和“下午2点到4点”。interval 模块使用 IntervalSet 类来表示这种区间集合。
IntervalSet 对象本身也支持 in 操作,它会高效地检查一个值是否落在集合中的任何一个区间内。
创建 IntervalSet
你可以通过传入一个 interval 对象列表来创建 IntervalSet。
import interval as iv # 创建两个独立的区间 int1 = iv.interval(1, 3) int2 = iv.interval(7, 9) # 将它们组合成一个区间集合 my_set = iv.IntervalSet([int1, int2]) print(my_set) # 输出: [1,3] U [7,9] (U 表示并集 Union) # 也可以直接用列表字面量创建 my_set_short = iv.IntervalSet([[1, 3], [7, 9]]) print(my_set_short) # 输出: [1,3] U [7,9]
集合操作
IntervalSet 支持类似 Python set 的操作,这是它最强大的功能之一。
-
并集: 或
.union()set1 = iv.IntervalSet([[1, 5]]) set2 = iv.IntervalSet([[3, 7]]) # 合并重叠或相邻的区间 union_set = set1 | set2 print(union_set) # 输出: [1,7]
-
交集:
&或.intersection()set1 = iv.IntervalSet([[1, 5]]) set2 = iv.IntervalSet([[3, 7]]) # 找出两个集合共有的部分 intersection_set = set1 & set2 print(intersection_set) # 输出: [3,5]
-
差集: 或
.difference()set1 = iv.IntervalSet([[1, 5]]) set2 = iv.IntervalSet([[3, 7]]) # 从 set1 中移除与 set2 重叠的部分 difference_set = set1 - set2 print(difference_set) # 输出: [1,3)
-
对称差集:
^或.symmetric_difference()set1 = iv.IntervalSet([[1, 5]]) set2 = iv.IntervalSet([[3, 7]]) # 获取只在其中一个集合中的部分 sym_diff_set = set1 ^ set2 print(sym_diff_set) # 输出: [1,3) U (5,7]
实用方法
IntervalSet 还提供了一些非常实用的方法。
-
添加区间:
.add()s = iv.IntervalSet() s.add(iv.interval(10, 20)) print(s) # 输出: [10,20]
-
合并所有区间:
.compact()这个方法会自动合并所有重叠或相邻的区间,保持IntervalSet处于最简形式,当你创建一个新的IntervalSet或进行操作后,它通常会自动调用。 -
转换为列表:
.iterable或.tolist()s = iv.IntervalSet([[1, 3], [5, 7]]) print(s.iterable) # 输出: [(1, 3), (5, 7)] print(s.tolist()) # 输出: [[1, 3], [5, 7]]
完整示例:处理会议室预订时间
假设我们要管理一个会议室,并检查某个时间段是否可用。
import interval as iv
# 会议室已经被预订的时间段
booked_times = iv.IntervalSet([
[9, 10], # 上午9点到10点
[11, 12], # 上午11点到12点
[14, 15] # 下午2点到3点
])
print(f"已预订时间: {booked_times}")
# 检查一个新请求的时间段是否可用
def is_available(start_time, end_time, booked_set):
"""
检查从 start_time 到 end_time 的时间段是否可用。
"""
requested_interval = iv.interval(start_time, end_time)
# 如果请求的时间段与任何已预订的时间段有交集,则不可用
if requested_interval in booked_set:
return False
return True
# 测试1: 请求一个空闲的时间
print("\n--- 测试1 ---")
request1 = (10, 11) # 10点到11点
if is_available(*request1, booked_times):
print(f"{request1} 时间段可用!")
else:
print(f"{request1} 时间段已被预订。")
# 测试2: 请求一个部分被预订的时间
print("\n--- 测试2 ---")
request2 = (9:30, 10:30) # 9:30到10:30
if is_available(*request2, booked_times):
print(f"{request2} 时间段可用!")
else:
print(f"{request2} 时间段已被预订。")
# 测试3: 尝试预订一个新的时间段
print("\n--- 测试3 ---")
new_booking = (15, 16) # 下午3点到4点
if is_available(*new_booking, booked_times):
booked_times.add(iv.interval(*new_booking))
print(f"成功预订 {new_booking},当前预订: {booked_times}")
else:
print(f"无法预订 {new_booking},时间冲突。")
# 测试4: 合并两个预订
print("\n--- 测试4 ---")
booked_times.add(iv.interval(14, 16)) # 尝试添加一个与现有预订重叠的时间
print(f"添加重叠区间后,自动合并,当前预订: {booked_times}")
| 特性 | 描述 |
|---|---|
interval 对象 |
代表单个连续的区间,可以是开、闭或无限区间。 |
IntervalSet 对象 |
代表一个或多个不连续区间的集合,是模块的核心。 |
in 操作 |
用于高效地检查一个值是否在单个 interval 或 IntervalSet 中。 |
| 集合操作 | 支持 (并集), & (交集), (差集), ^ (对称差集),非常直观。 |
| 自动合并 | IntervalSet 会自动处理重叠和相邻的区间,保持数据整洁。 |
| 实用性 | 非常适合处理时间表、资源分配、范围查询、数据分析等场景。 |
interval 模块是一个设计精良、功能强大的工具,能让你用非常 Pythonic 的方式处理区间相关的逻辑,如果你需要进行复杂的区间运算,它绝对是首选。
