如何用Python实现Number-span elision(数字跨度省略)功能?
实现数字跨度省略(Number-span elision)的Python代码
需求说明
数字跨度省略(又称数字缩写、digit-dropping)是指将页码等数字范围进行缩写,保留起始数字的完整形式,结束数字仅保留与起始数字从左到右第一个不同位开始的剩余部分。典型示例:
- 42–43 → 42–3
- 123–128 → 123–8
- 100–104 → 100–4
- 1496–1500 → 1496–500
实现思路
- 将输入的跨度字符串按特定分隔符
–分割为起始数字和结束数字 - 把两个数字转为字符串,方便逐位对比字符
- 从左到右遍历字符,找到第一个不相同的位置索引
- 截取结束数字从该索引开始的部分,作为缩写后的内容
- 拼接起始数字、分隔符和缩写后的结束数字,得到最终结果
Python代码实现
def elide_number_span(span_str): # 按全角破折号分割起始与结束数字 start_str, end_str = span_str.split('–') common_prefix_len = 0 max_compare_len = min(len(start_str), len(end_str)) # 遍历找到最长公共前缀的长度 while common_prefix_len < max_compare_len and start_str[common_prefix_len] == end_str[common_prefix_len]: common_prefix_len += 1 # 截取结束数字的非公共前缀部分 elided_end = end_str[common_prefix_len:] return f"{start_str}–{elided_end}" # 测试示例输入 test_cases = [ "3–10", "12–18", "71–72", "96–117", "100–104", "1100–1113", "101–108", "808–833", "1103–1104", "321–328", "498–532", "1013–1019", "1087–1089", "1496–1500", "11564–11615", "12991–13001" ] # 输出测试结果 for case in test_cases: print(f"{case} → {elide_number_span(case)}")
测试输出
运行代码后,输出结果如下:
3–10 → 3–10 12–18 → 12–8 71–72 → 71–2 96–117 → 96–117 100–104 → 100–4 1100–1113 → 1100–13 101–108 → 101–8 808–833 → 808–33 1103–1104 → 1103–4 321–328 → 321–8 498–532 → 498–532 1013–1019 → 1013–9 1087–1089 → 1087–9 1496–1500 → 1496–500 11564–11615 → 11564–615 12991–13001 → 12991–3001
内容的提问来源于stack exchange,提问作者rcv
相关产品推荐
相关产品推荐

