杰瑞科技汇

python interval模块

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

python interval模块-图1
(图片来源网络,侵删)

安装

你需要安装这个模块,打开你的终端或命令行,运行以下命令:

pip install interval

核心概念:interval 对象

interval 模块的核心是 interval 类,一个 interval 对象代表一个连续的范围。

创建区间

创建区间最常用的方法是使用 interval() 函数,它接受两个参数:start(开始)和 end(结束)。

  • 闭区间:默认情况下,区间是闭区间,包含边界值。

    python interval模块-图2
    (图片来源网络,侵删)
    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 操作 用于高效地检查一个值是否在单个 intervalIntervalSet 中。
集合操作 支持 (并集), & (交集), (差集), ^ (对称差集),非常直观。
自动合并 IntervalSet 会自动处理重叠和相邻的区间,保持数据整洁。
实用性 非常适合处理时间表、资源分配、范围查询、数据分析等场景。

interval 模块是一个设计精良、功能强大的工具,能让你用非常 Pythonic 的方式处理区间相关的逻辑,如果你需要进行复杂的区间运算,它绝对是首选。

分享:
扫描分享到社交APP
上一篇
下一篇