You need to enable JavaScript to run this app. Python基于列表均值实现元素与均值高低关系切换的递增类别分配
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 16:36:04