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

