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

Python 实现双列表生成带同位索引互斥规则的无重复排列

实现思路
  • 先把两个列表的每个元素和其对应索引k绑定,生成候选元素池,每个元素格式为(元素值, 对应索引k)
  • 调用排列生成工具生成指定长度的排列,仅保留排列中所有元素索引k不重复的结果
  • 把符合条件的排列的元素值拼接为字符串,就是最终结果
完整代码
import itertools

def generate_permutations(digits: list[str], chars: list[str], perm_length: int) -> list[str]:
    # 输入合法性校验
    max_available_len = min(len(digits), len(chars))
    if perm_length > max_available_len or perm_length < 1:
        raise ValueError(f"排列长度需在1到{max_available_len}之间")
    # 构造带索引的候选元素池
    candidates = []
    for k in range(max_available_len):
        candidates.append((digits[k], k))
        candidates.append((chars[k], k))
    result = []
    # 生成排列并过滤不符合规则的项
    for perm in itertools.permutations(candidates, perm_length):
        used_indexes = set(item[1] for item in perm)
        if len(used_indexes) == perm_length:
            result.append(''.join(item[0] for item in perm))
    # 如需固定输出顺序可取消下一行注释
    # result.sort()
    return result
测试验证

使用题目给出的示例输入测试:

digits = ['1', '2', '3', '4']
chars = ['!', '@', '#', '$']
output = generate_permutations(digits, chars, 2)
for item in output:
    print(item)

运行后输出的结果集合和题目给出的预期完全一致,仅输出顺序可能不同,符合要求。如果对输出顺序有要求,取消代码中result.sort()的注释即可。

如果需要更高的运行性能,可以改用回溯法实现,在构造排列的过程中直接跳过已使用的索引,避免先生成全量排列再过滤,对于输入长度不超过10的场景,当前实现已经足够简洁易用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:06:07