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

Python 如何基于元组得分生成指定数量的唯一随机单词组合

解决方案

实现思路

  1. 先对4个输入列表做预处理,按得分分组存储对应可选字母,后续查询无需重复遍历列表
  2. 生成所有符合总得分要求的4元得分组合(每个元素对应4个列表取出字母的得分,取值范围1~4,四数之和等于目标得分)
  3. 随机选择得分组合,再从对应得分的字母池中随机选字母拼接成单词,用集合自动去重,直到拿到指定数量的唯一单词或穷尽所有可能的组合

完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 17:09:03