Python:排序列表的列表并合并同动物连续元素的方法问询
解决思路与实现代码
我来帮你搞定这个合并连续项的问题!其实你已经走对了第一步——排序,只是还差对连续区间的判断和合并逻辑。下面一步步拆解怎么做:
核心步骤
- 正确排序:先按动物名称字母排序,再按第二个元素的数值大小排序(注意要把字符串转成整数,不然字符串排序会出现
'28'排在'4'前面的问题)。 - 按动物分组:用
itertools.groupby把同一动物的项聚在一起,方便后续处理连续区间。 - 合并连续区间:遍历每个动物的分组,维护当前连续区间的起始/结束数值,以及对应的第三个元素的起始/结束值,遇到不连续的项就把当前区间存入结果,再重置区间。
完整代码实现
import itertools # 原始数据 data = [ ['lion', '23', '35'], ['lion', '24', '68'], ['elephant', '23', '34'], ['monkey', '4', '20'], ['monkey', '5', '25'], ['monkey','28', '90'], ['lion', '33', '2'] ] # 第一步:正确排序——先按动物名称,再按第二个元素的数值(转int避免字符串排序坑) sorted_data = sorted(data, key=lambda x: (x[0], int(x[1]))) result = [] # 第二步:按动物名称分组 for animal, group in itertools.groupby(sorted_data, key=lambda x: x[0]): group_list = list(group) if not group_list: continue # 初始化当前连续区间:取第一个项的数值和对应值 current_start_num = int(group_list[0][1]) current_end_num = current_start_num current_start_val = group_list[0][2] current_end_val = current_start_val # 第三步:遍历分组内的剩余项,判断是否连续 for item in group_list[1:]: num = int(item[1]) val = item[2] # 如果当前项的数值是上一个结束值+1,说明连续,更新区间 if num == current_end_num + 1: current_end_num = num current_end_val = val else: # 不连续,把当前区间整理成结果项,然后重置区间 num_str = f"{current_start_num}-{current_end_num}" if current_start_num != current_end_num else str(current_start_num) val_str = f"{current_start_val}-{current_end_val}" if current_start_val != current_end_val else current_start_val result.append([animal, num_str, val_str]) # 重置为当前项的数值和值 current_start_num = num current_end_num = num current_start_val = val current_end_val = val # 处理最后一个区间 num_str = f"{current_start_num}-{current_end_num}" if current_start_num != current_end_num else str(current_start_num) val_str = f"{current_start_val}-{current_end_val}" if current_start_val != current_end_val else current_start_val result.append([animal, num_str, val_str]) # 输出结果 for item in result: print(item)
代码解释
- 排序部分:
sorted(data, key=lambda x: (x[0], int(x[1])))确保先按动物名称字母排序,再按第二个元素的数值排序,解决了字符串排序的问题。 - 分组部分:
itertools.groupby把同一动物的所有项归为一组,这样我们可以逐个处理每个动物的连续区间。 - 合并逻辑:通过维护当前区间的起始/结束数值和对应值,每次判断下一个项是否连续,连续就扩展区间,不连续就把当前区间存入结果并重置。最后别忘了处理每组的最后一个区间。
运行这段代码后,你会得到想要的结果:
['elephant', '23', '34'] ['lion', '23-24', '35-68'] ['lion', '33', '2'] ['monkey', '4-5', '20-25'] ['monkey', '28', '90']
内容的提问来源于stack exchange,提问作者user1709612
相关产品推荐
相关产品推荐

