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

嵌套列表按分组条件比较元素的计数规则实现问询

解决方法:分组后检查严格递增序列

我来帮你搞定这个计数逻辑!咱们先把需求拆解清楚,再一步步实现代码。

需求回顾

你有一个嵌套列表,需要完成以下操作:

  1. 按子列表的第二个元素(条件标识)分组
  2. 检查每个分组内的第一个元素是否严格递增(每个元素都小于它的下一个元素)
  3. 计数器初始值为1,每遇到一个满足条件的分组,计数器加1

实现思路

核心步骤分为两步:分组和检查递增条件,下面我给你两种常用的实现方式。


方法一:用itertools.groupby分组(适合有序场景)

groupby是Python标准库中专门用于分组的工具,但要注意它只会把连续相同键的元素分到一组,所以我们需要先按条件标识排序:

from itertools import groupby

lst = [[2, 1], [5, 1], [10, 1], [9, 1], [10, 2], [18, 2]]
counter = 1

# 先按条件标识排序,确保同组元素连续
sorted_list = sorted(lst, key=lambda x: x[1])

# 按条件标识分组
for _, group in groupby(sorted_list, key=lambda x: x[1]):
    # 提取分组内所有第一个元素
    values = [item[0] for item in group]
    # 检查是否严格递增:所有相邻元素都满足前小后大
    is_increasing = all(x < y for x, y in zip(values, values[1:]))
    if is_increasing:
        counter += 1

print(counter)  # 输出:2
关键细节解释:
  • zip(values, values[1:]):把列表中相邻的元素配对,比如[2,5,10,9]会生成(2,5), (5,10), (10,9)
  • all(...):只要有一对不满足x<y,就会返回False,只有所有配对都满足才返回True

方法二:用字典手动分组(无需排序,更直观)

如果不想依赖标准库,也可以用字典手动收集同组元素,这种方法不需要提前排序:

lst = [[2, 1], [5, 1], [10, 1], [9, 1], [10, 2], [18, 2]]
counter = 1

# 用字典存储分组:键是条件标识,值是对应的第一个元素列表
groups = {}
for val, key in lst:
    if key not in groups:
        groups[key] = []
    groups[key].append(val)

# 遍历每个分组检查递增条件
for values in groups.values():
    is_increasing = all(x < y for x, y in zip(values, values[1:]))
    if is_increasing:
        counter += 1

print(counter)  # 输出:2
为什么这个方法可行?

不管原列表中同标识的元素位置如何,字典都会把它们全部收集到同一个列表里,直接检查整个列表的递增性即可。


结果验证

按照你的例子:

  • 标识为1的分组:[2,5,10,9],因为10>9不满足严格递增,计数器不变
  • 标识为2的分组:[10,18],满足10<18,计数器加1
    最终计数器从初始的1变为2,符合预期。

内容的提问来源于stack exchange,提问作者Zaruya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:23:39