Python生成多组加权随机属性集合时如何确保没有重复值
问题分析与代码调整方案
你的代码存在两个需要修正的核心问题:
- 代码笔误:
attCone1、attColor1、attAcces1、attShadow1生成时,choices的第一个参数都错误写成了attEyes,会导致这几个属性实际都是按眼睛的权重生成,不符合预期。 - 缺少去重逻辑:直接循环100次生成并打印,没有校验当前生成的属性集合是否和历史生成的重复。
调整后可实现去重的代码
from random import choices # 统一配置各属性的可选值和对应权重,减少冗余代码 attr_config = [ ([1,2,3,4,5,6], [0.3, 0.2, 0.05, 0.15, 0.3, 0.25]), # 头发属性 ([1,2,3,4,5,6], [0.3, 0.2, 0.05, 0.15, 0.5, 0.25]), # 眼睛属性 ([1,2,3,4,5,6], [0.3, 0.2, 0.05, 0.15, 0.5, 0.25]), # attCone属性 ([1,2,3,4,5,6], [0.3, 0.2, 0.05, 0.15, 0.5, 0.25]), # 颜色属性 ([1,2,3,4,5,6], [0.3, 0.2, 0.05, 0.15, 0.5, 0.25]), # 配饰属性 ([1,2,3,4,5,6], [0.3, 0.2, 0.05, 0.15, 0.5, 0.25]), # 阴影属性 ] target_num = 100 # 需要生成的不重复属性组数量 generated_set = set() # 存储已生成的属性组合用于去重校验 final_result = [] # 存储最终的有效不重复结果 while len(final_result) < target_num: current_attr = [] for val_list, weight_list in attr_config: # choices返回列表,取第一个元素拼接为当前属性组 current_attr.append(choices(val_list, weights=weight_list)[0]) # 列表不可哈希,转元组后存入集合做去重校验 current_tuple = tuple(current_attr) if current_tuple not in generated_set: generated_set.add(current_tuple) final_result.append(current_attr) # 生成有效不重复条目时打印,也可后续统一处理final_result print(current_attr)
后续如果需要修改任意属性的可选值、权重,只需要调整attr_config里对应位置的配置即可,不用重复编写多段生成逻辑。
内容的提问来源于stack exchange,提问作者Yorowne
相关产品推荐
相关产品推荐

