Python基于列表均值实现元素与均值高低关系切换的递增类别分配
实现方案
核心逻辑
- 先计算列表元素的均值
mean - 把每个元素和均值比较,得到二值状态(高于均值/低于均值)
- 从第一个元素开始分配编号1,后续元素只要和前一个的高低状态一致,就沿用当前编号;一旦状态切换,编号自增1,直到遍历完所有元素。
代码实现
1. 纯Python版本(无第三方依赖)
适合小规模列表场景,无需安装numpy即可运行:
x = [1000, 950, 860, 1120, 430, 270, 0, 15, 0, 26, 278, 0, 950, 1020, 980, 1040, 670, 540, 820, 0, 0, 0, 190, 270, 479, 1247] mean = sum(x) / len(x) class_ids = [] if x: prev_state = x[0] > mean current_id = 1 class_ids.append(current_id) # 从第二个元素开始遍历 for val in x[1:]: current_state = val > mean # 状态切换时递增编号 if current_state != prev_state: current_id += 1 prev_state = current_state class_ids.append(current_id) print(class_ids)
2. NumPy版本(适合大规模列表)
性能更高,对长度超过1万的列表处理效率远优于纯Python循环:
import numpy as np x = [1000, 950, 860, 1120, 430, 270, 0, 15, 0, 26, 278, 0, 950, 1020, 980, 1040, 670, 540, 820, 0, 0, 0, 190, 270, 479, 1247] mean = np.mean(x) x_arr = np.array(x) # 生成每个元素的高低状态 states = x_arr > mean # 标记相邻状态是否发生切换 state_changes = np.concatenate([[0], np.diff(states.astype(int)) != 0]) # 累计变化次数生成从1开始的连续编号 class_ids = np.cumsum(state_changes) + 1 print(class_ids.tolist())
输出验证
两个版本运行后得到的结果和示例预期完全一致:[1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5]
注意:若存在元素刚好等于均值的场景,可根据业务规则调整比较逻辑(比如将比较运算符替换为>=/<=),整体编号流程无需改动。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

