You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python:排序列表的列表并合并同动物连续元素的方法问询

解决思路与实现代码

我来帮你搞定这个合并连续项的问题!其实你已经走对了第一步——排序,只是还差对连续区间的判断和合并逻辑。下面一步步拆解怎么做:

核心步骤

  1. 正确排序:先按动物名称字母排序,再按第二个元素的数值大小排序(注意要把字符串转成整数,不然字符串排序会出现'28'排在'4'前面的问题)。
  2. 按动物分组:用itertools.groupby把同一动物的项聚在一起,方便后续处理连续区间。
  3. 合并连续区间:遍历每个动物的分组,维护当前连续区间的起始/结束数值,以及对应的第三个元素的起始/结束值,遇到不连续的项就把当前区间存入结果,再重置区间。

完整代码实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:12:22