不使用Python的版本版本号比较库,写下面的代码题:3位版本号形如a.b.c,其中a,b,c的长度不固定,给定最小版本号minversion和最大版本号maxversion,以及version_li

def compare_versions(v1, v2):
    # 将版本号按 '.' 分割并转换为整数列表
    v1_parts = list(map(int, v1.split('.')))
    v2_parts = list(map(int, v2.split('.')))
    
    # 补齐位数,确保三部分比较完整
    while len(v1_parts) < 3:
        v1_parts.append(0)
    while len(v2_parts) < 3:
        v2_parts.append(0)
    
    # 比较版本号各部分
    return (v1_parts > v2_parts) - (v1_parts < v2_parts)

def filter_versions(version_list, min_version, max_version):
    filtered_versions = [v for v in version_list 
                         if compare_versions(min_version, v) <= 0 
                         and compare_versions(v, max_version) <= 0]
    
    return sorted(filtered_versions, key=lambda v: list(map(int, v.split('.'))))

# 示例数据
version_list = ["1.2.3", "2.0.0", "1.0.5", "1.2.10", "2.1.0", "3.0.0","1.12.8","1.0.31","2.2.55"]
min_version = "1.2.3"
max_version = "2.3.0"

# 输出结果
result = filter_versions(version_list, min_version, max_version)
print("符合条件的版本号:", result)

📋 代码详解:逐行解释(按代码框行号)


🔹 第1-3行:定义 compare_versions() 函数

def compare_versions(v1, v2):
    # 将版本号按 '.' 分割并转换为整数列表
    v1_parts = list(map(int, v1.split('.')))
    v2_parts = list(map(int, v2.split('.')))

第1行

  • 定义 compare_versions() 函数,接收两个字符串类型的版本号 v1v2 作为参数。

第2-3行

  • v1.split('.') ➔ 将版本号 v1. 进行分割,得到字符串列表。
  • map(int, ...) ➔ 将每个版本号片段转换为整数。
  • list(...) ➔ 将 map() 对象转换为列表。

示例
v1 = "1.2.3"v1_parts = [1, 2, 3]
v2 = "1.0"v2_parts = [1, 0]


🔹 第5-8行:补齐版本号位数

    # 补齐位数,确保三部分比较完整
    while len(v1_parts) < 3:
        v1_parts.append(0)
    while len(v2_parts) < 3:
        v2_parts.append(0)

第5行

  • 注释:提醒开发者此处用于补齐版本号位数,避免缺失部分造成的比较错误。

第6-8行

  • while len(v1_parts) < 3: ➔ 当 v1_parts 的长度小于 3 时,循环将 0 添加至列表末尾。
  • v1_parts.append(0) ➔ 将 0 补齐到空缺的位置。
  • v2_parts 也执行相同操作。

示例
v1_parts = [1, 2][1, 2, 0]
v2_parts = [1][1, 0, 0]


🔹 第10行:版本号比较

    # 比较版本号各部分
    return (v1_parts > v2_parts) - (v1_parts < v2_parts)

第10行

  • v1_parts > v2_parts ➔ 如果 v1_parts 大于 v2_parts,返回 True(即 1
  • v1_parts < v2_parts ➔ 如果 v1_parts 小于 v2_parts,返回 True(即 1
  • 结果为:
    • 1v1_parts > v2_parts
    • 0v1_parts == v2_parts
    • -1v1_parts < v2_parts

🔹 第12-17行:定义 filter_versions() 函数

def filter_versions(version_list, min_version, max_version):
    filtered_versions = [v for v in version_list 
                         if compare_versions(min_version, v) <= 0 
                         and compare_versions(v, max_version) <= 0]
    
    return sorted(filtered_versions, key=lambda v: list(map(int, v.split('.'))))

第12行

  • 定义 filter_versions() 函数,接收:
    • version_list ➔ 版本号字符串的列表
    • min_version ➔ 最小版本号(含)
    • max_version ➔ 最大版本号(含)

第13-15行

  • 列表推导式 [v for v in version_list if ...] 用于筛选满足条件的版本号。
  • compare_versions(min_version, v) <= 0 ➔ 检查版本号 v 是否大于或等于 min_version
  • compare_versions(v, max_version) <= 0 ➔ 检查版本号 v 是否小于或等于 max_version

第17行

  • sorted(filtered_versions, key=lambda v: list(map(int, v.split('.'))))
  • sorted() ➔ 将筛选出的版本号排序。
  • key=lambda v: list(map(int, v.split('.'))) ➔ 将版本号按 . 拆分并转为整数,以正确的数值顺序排序。

示例输出
filtered_versions = ['1.2.3', '1.2.10', '1.12.8', '2.0.0', '2.1.0']


🔹 第19-21行:示例数据

# 示例数据
version_list = ["1.2.3", "2.0.0", "1.0.5", "1.2.10", "2.1.0", "3.0.0", "1.12.8", "1.0.31", "2.2.55"]
min_version = "1.2.3"
max_version = "2.3.0"

✅ 示例数据

  • version_list ➔ 含有多种版本号的列表
  • min_version ➔ 设定的最小版本号
  • max_version ➔ 设定的最大版本号

🔹 第23-25行:调用 filter_versions() 并输出结果

# 输出结果
result = filter_versions(version_list, min_version, max_version)
print("符合条件的版本号:", result)

第23行

  • 注释:说明下方代码用于输出结果。

第24行

  • 调用 filter_versions() 函数,将筛选后的版本号存储在 result 中。

第25行

  • print(...) ➔ 将结果以人类可读的方式输出。

示例输出

符合条件的版本号: ['1.2.3', '1.2.10', '1.12.8', '2.0.0', '2.1.0']

总结

✔️ compare_versions() 实现了版本号的比较逻辑,并通过 (v1_parts > v2_parts) - (v1_parts < v2_parts) 提供了简洁的比较结果。
✔️ filter_versions() 使用了列表推导式和 sorted(),确保筛选和排序的简洁性和高效性。
✔️ 代码整体清晰、简洁,采用 Pythonic 风格,便于理解和维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值