嵌套列表按分组条件比较元素的计数规则实现问询
解决方法:分组后检查严格递增序列
我来帮你搞定这个计数逻辑!咱们先把需求拆解清楚,再一步步实现代码。
需求回顾
你有一个嵌套列表,需要完成以下操作:
- 按子列表的第二个元素(条件标识)分组
- 检查每个分组内的第一个元素是否严格递增(每个元素都小于它的下一个元素)
- 计数器初始值为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
相关产品推荐
相关产品推荐

