Python中如何对字符串形式表示的不同类型区间列表进行正确排序
区间字符串正确排序方案
原代码错误原因
你之前的写法会过滤掉区间字符串里的小数点,仅拼接数字字符转换为浮点值,导致数值解析完全错误:例如<0.05会被解析为005→5.0,单值1会被解析为1.0,所以会出现1排在最前面的问题。
解决思路
所有区间都是不重叠的左闭右开区间,我们可以提取每个区间的左边界值作为排序key:
- 单值直接转为浮点值作为key,例如
1→1.0,自然排在所有小于1的区间之后 - 同时带上下界的区间,提取
>=后的左边界值作为key - 仅带上界的区间(以
<开头),提取上界值后减去极小值作为key,保证其排在所有大于等于该值的区间之前 - 如果存在仅带下界的区间(以
>=开头无AND),直接提取>=后的数值作为key即可
实现代码
import re def get_sort_key(interval_str): # 匹配单值(整数或小数) if re.fullmatch(r'\d+(\.\d+)?', interval_str.strip()): return float(interval_str) # 匹配带<的仅上界区间 if interval_str.strip().startswith('<'): upper = float(re.search(r'\d+(\.\d+)?', interval_str).group()) # 减去极小值保证排序优先级更高 return upper - 1e-9 # 匹配带>=的区间(不管有没有AND) if '>=' in interval_str: lower = float(re.search(r'>=\s*(\d+(\.\d+)?)', interval_str).group(1)) return lower # 其他特殊情况可自行补充规则 return 0.0 # 排序 sorted_levels = sorted(unique_levels, key=get_sort_key)
排序后结果
按上述代码排序后的输出如下,符合预期:
['<0.05', '>= 0.05 AND < 0.1', '>= 0.1 AND < 0.15', '>= 0.15 AND < 0.2', '>= 0.2 AND < 0.25', '>= 0.25 AND < 0.3', '>= 0.3 AND < 0.35', '>= 0.35 AND < 0.4', '>= 0.4 AND < 0.45', '>= 0.45 AND < 0.5', '>= 0.5 AND < 0.55', '>= 0.55 AND < 0.6', '>= 0.6 AND < 0.65', '>= 0.65 AND < 0.7', '>= 0.7 AND < 0.75', '>= 0.75 AND < 0.8', '>= 0.8 AND < 0.85', '>= 0.85 AND < 0.9', '>= 0.9 AND < 0.95', '>= 0.95 AND < 1', '1']
内容的提问来源于stack exchange,提问作者43zombiegit
相关产品推荐
相关产品推荐

