在Python数据处理过程中,统计高低对数量是经常会遇到的需求,这里的高低对指的是在一个序列中,相邻两个元素满足前一个元素的值小于后一个元素的值的配对情况。比如序列[1,3,2,4]中,1和3、2和4就是两组高低对,统计结果应为2。

普通循环实现方式
最基础的实现方式是使用for循环遍历序列,逐个判断相邻元素的关系,代码如下:
# 定义待统计的序列
nums = [1, 3, 2, 4, 5, 2]
# 初始化高低对数量
count = 0
# 遍历序列,到倒数第二个元素为止
for i in range(len(nums) - 1):
# 判断前一个元素是否小于后一个元素
if nums[i] < nums[i + 1]:
count += 1
print(count) # 输出结果 3
这种方式逻辑清晰,但是代码行数较多,不够简洁。
使用列表推导式实现
列表推导式可以用一行代码完成高低对的判断和统计,核心逻辑是将每个相邻元素对的判断结果转换为1或0,再求和。代码如下:
nums = [1, 3, 2, 4, 5, 2] # 列表推导式生成每个相邻对是否为高低对的结果,1表示是,0表示否 pair_results = [1 if nums[i] < nums[i + 1] else 0 for i in range(len(nums) - 1)] # 求和得到高低对数量 count = sum(pair_results) print(count) # 输出结果 3
也可以将逻辑合并为一行,进一步简化代码:
nums = [1, 3, 2, 4, 5, 2] count = sum(1 for i in range(len(nums) - 1) if nums[i] < nums[i + 1]) print(count) # 输出结果 3
使用生成器表达式实现
如果序列长度非常大,列表推导式会先生成完整的列表占用内存,此时使用生成器表达式更合适,它不会一次性生成所有结果,而是按需计算,内存占用更低。代码如下:
nums = [1, 3, 2, 4, 5, 2] # 生成器表达式,逻辑和列表推导式类似,只是把方括号换成圆括号 count = sum(1 for i in range(len(nums) - 1) if nums[i] < nums[i + 1]) print(count) # 输出结果 3
两种方式的适用场景对比
我们可以通过下表对比列表推导式和生成器表达式的特点:
| 实现方式 | 内存占用 | 适用场景 |
|---|---|---|
| 列表推导式 | 较高,会生成完整列表 | 序列长度较小,需要多次使用中间结果 |
| 生成器表达式 | 极低,按需计算 | 序列长度极大,只需要一次性求和结果 |
扩展:处理自定义高低规则
如果高低对的判断规则不是简单的前小后大,比如需要前一个元素比后一个元素小2以上才算高低对,只需要修改判断条件即可,生成器表达式的实现如下:
nums = [1, 4, 2, 5, 6, 2] # 自定义规则:前一个元素比后一个元素小2以上才算高低对 count = sum(1 for i in range(len(nums) - 1) if nums[i] + 2 < nums[i + 1]) print(count) # 输出结果 2,分别是1和4、2和5
通过修改判断条件,列表推导式和生成器表达式可以适配各种自定义的高低对统计需求,非常灵活。