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()
函数,接收两个字符串类型的版本号v1
和v2
作为参数。
✅ 第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
)- 结果为:
1
➔v1_parts
>v2_parts
0
➔v1_parts
==v2_parts
-1
➔v1_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 风格,便于理解和维护。