技术问询:如何将连续数字替换为数字范围,同时保留随机数字
处理数字序列:将连续数字转为范围格式,保留非连续数字
这问题我之前做数据整理时经常碰到,核心思路就是遍历数字序列,跟踪当前连续区间的起始和结束值,遇到断档就把当前区间按规则输出(单个数字直接保留,连续区间转成x-y格式),然后重置起始值继续处理后面的数字。
核心逻辑拆解
- 先把输入的字符串分割成整数列表(其他语言思路一致,只是语法差异)
- 用两个变量
start和end记录当前连续区间的首尾数字 - 遍历每个后续数字:
- 如果当前数字是
end + 1,说明属于同一连续区间,更新end - 如果不连续,就把当前区间加入结果列表,然后重置
start和end为当前数字
- 如果当前数字是
- 遍历结束后,别忘了把最后一个区间也加入结果
Python代码实现(支持有序/无序输入)
下面是我常用的实现,还加了可选的排序参数——如果你的输入数字是无序的,开启排序后能正确识别分散的连续数字:
def format_number_sequence(input_str, sort_first=False): # 分割输入字符串并转换为整数列表 nums = list(map(int, input_str.split(','))) if not nums: return "" # 可选:先对数字排序,处理无序输入的情况 if sort_first: nums.sort() result = [] start = end = nums[0] for num in nums[1:]: # 判断是否属于当前连续区间 if num == end + 1: end = num else: # 处理当前区间:单个数字直接转字符串,连续区间转x-y格式 if start == end: result.append(str(start)) else: result.append(f"{start}-{end}") # 重置区间首尾为当前数字 start = end = num # 处理最后一个未加入结果的区间 if start == end: result.append(str(start)) else: result.append(f"{start}-{end}") return ','.join(result)
测试示例
- 有序输入(和你的例子一致):
print(format_number_sequence("1,2,3,4,5,6,458,243")) # 输出:1-6,458,243 - 无序输入(开启排序):
print(format_number_sequence("3,1,2,5,458,243", sort_first=True)) # 输出:1-3,5,243,458 - 边界情况测试:
- 单个数字:
format_number_sequence("123")→ 输出123 - 全连续数字:
format_number_sequence("7,8,9,10")→ 输出7-10 - 全非连续数字:
format_number_sequence("5,10,15")→ 输出5,10,15
- 单个数字:
其他语言思路
如果用JavaScript、Java等语言,逻辑完全一致:
- 分割字符串转数字数组
- 初始化区间首尾变量
- 遍历数组判断连续性
- 拼接结果字符串
内容的提问来源于stack exchange,提问作者PR173




