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
相关产品推荐
相关产品推荐

