Python 如何基于元组得分生成指定数量的唯一随机单词组合
解决方案
实现思路
- 先对4个输入列表做预处理,按得分分组存储对应可选字母,后续查询无需重复遍历列表
- 生成所有符合总得分要求的4元得分组合(每个元素对应4个列表取出字母的得分,取值范围1~4,四数之和等于目标得分)
- 随机选择得分组合,再从对应得分的字母池中随机选字母拼接成单词,用集合自动去重,直到拿到指定数量的唯一单词或穷尽所有可能的组合
完整代码
import random from itertools import product # 输入的四个原始列表 liste1 = [('A',1), ('E',1), ('I',1), ('O',1), ('U',1), ('M',2), ('N',2), ('B',2), ('Y',2), ('R',3), ('E',3), ('T',3), ('G',4), ('J',4)] liste2 = [('A',1), ('E',1), ('I',1), ('O',1), ('U',1), ('L',2), ('N',2), ('Z',2), ('Y',2), ('R',3), ('E',3), ('P',3), ('F',4), ('X',4)] liste3 = [('A',1), ('E',1), ('I',1), ('O',1), ('U',1), ('Q',2), ('N',2), ('B',2), ('Y',2), ('R',3), ('E',3), ('T',3), ('H',4), ('J',4)] liste4 = [('A',1), ('E',1), ('I',1), ('O',1), ('U',1), ('M',2), ('N',2), ('B',2), ('Y',2), ('R',3), ('E',3), ('T',3), ('S',4), ('J',4)] def build_score_map(lst): """将输入的字母得分列表转为 {得分: [字母列表]} 的映射""" score_map = {} for char, score in lst: score_map.setdefault(score, []).append(char) return score_map # 预处理四个列表的得分映射,仅需执行一次 map1 = build_score_map(liste1) map2 = build_score_map(liste2) map3 = build_score_map(liste3) map4 = build_score_map(liste4) # 每个位置的可选得分范围都是1-4 possible_scores = [1,2,3,4] def generate_words(target_score: int, count: int) -> list[str]: """ 生成指定数量总得分匹配的唯一单词 :param target_score: 目标总得分,范围4~16 :param count: 需要生成的单词数量 :return: 生成的单词列表 """ if not 4 <= target_score <= 16: raise ValueError("目标得分范围必须是4~16") # 筛选所有符合总得分要求的得分组合 valid_score_combs = [comb for comb in product(possible_scores, repeat=4) if sum(comb) == target_score] if not valid_score_combs: return [] result = set() max_try = count * 10 try_time = 0 # 最多尝试10倍需求数量的次数,避免穷尽所有组合时死循环 while len(result) < count and try_time < max_try: s1, s2, s3, s4 = random.choice(valid_score_combs) c1 = random.choice(map1[s1]) c2 = random.choice(map2[s2]) c3 = random.choice(map3[s3]) c4 = random.choice(map4[s4]) result.add(f"{c1}{c2}{c3}{c4}") try_time += 1 return list(result) # 测试示例:生成总得分为8的5个单词 print(generate_words(target_score=8, count=5))
补充说明
- 若要求生成的数量大于该得分下所有可能的唯一单词总数,函数会返回所有可生成的不重复单词
- 预处理和得分组合筛选逻辑可提前缓存,多次调用生成函数时性能更高
内容的提问来源于stack exchange,提问作者matthieu Daulhiac Edreldor
相关产品推荐
相关产品推荐

