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

Maya Python按百分比分割列表元素总数不符问题排查

问题根因

元素丢失是循环内计算分组长度时使用的*整数向下取整除法//*导致的:每次计算单组长度时,非整数的结果会被直接截断舍弃小数部分,所有分组的截断误差累积后,就会剩下若干元素没有被任何分组覆盖。
代入你传入的参数和154的总长度手动计算就能验证:

  • 70%分组长度:154 *70 //100 = 107,实际精确值为107.8,截断丢失0.8的余量
  • 10%分组长度:154 *10 //100 =15,实际精确值为15.4,截断丢失0.4的余量
  • 15%分组长度:154 *15 //100=23,实际精确值为23.1,截断丢失0.1的余量
  • 5%分组长度:154*5//100=7,实际精确值为7.7,截断丢失0.7的余量

四个分组长度加总为107+15+23+7=152,刚好差2个元素,这2个就是所有截断误差凑出的遗漏值,始终停留在列表尾部,没有被加入任何分组,自然不会被后续上色逻辑处理。

修复方案

最适配你当前场景的修复方式是:前N-1个分组按原有逻辑计算长度,最后一个分组直接取从当前起始位置到列表末尾的全部元素,自动兜住前面所有截断产生的遗漏元素,修改后的核心代码如下:

import maya.cmds as cmds
import random

def selector(percents):
    RandomSelection = []
    mySel = cmds.ls(sl=1)
    random.shuffle(mySel)
    total_count = len(mySel)
    
    start = 0
    # 除最后一组外,其余分组按百分比计算截断长度
    for cur in percents[:-1]:
        end = start + cur * total_count // 100
        RandomSelection.append(mySel[start:end])
        start = end
    # 最后一组直接取到列表末尾,不做长度计算,保证无遗漏
    RandomSelection.append(mySel[start:])
    
    print(len(mySel))  # 输出154
    print(sum(len(group) for group in RandomSelection))  # 输出154,和总长度一致
    
    for mesh in RandomSelection:
        r = [random.random() for i in range(3)]
        cmds.polyColorPerVertex(mesh,rgb=(r[0], r[1], r[2]), cdo=1 )


selector([70, 10, 15, 5])

如果对分组长度的均匀度要求更高,也可以替换为四舍五入的长度计算逻辑、配合误差动态调整,但对于随机分色的使用场景,上述尾组兜底的实现最简单,也完全能满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:48:09