如何从列表生成两组元素拼接后组成的所有可能二元组合
通用列表生成目标二元组的实现方案
前置规则明确
我们首先对齐二元组的生成约束:
- 两个分组必须覆盖原列表所有元素,且不存在重叠元素
- 分组内部的元素可以任意排序后拼接为整数
- 默认排除任意分组为空的情况(示例中无空分组对应的二元组,若有需要可保留)
实现步骤
步骤1:生成所有元素归属的拆分方案
对于长度为n的列表,每个元素有2种归属选择(分到第一组/第二组),总共有2n种拆分方式,过滤掉两组全空的情况后,剩余2n - 2种有效拆分。
步骤2:生成分组内的所有拼接数值
对每个拆分得到的两个分组,分别生成分组元素的全排列,将每种排列的元素按顺序拼接后转成整数。
步骤3:生成二元组集合
对同一拆分下两个分组的所有拼接数值做笛卡尔积,得到该拆分对应的所有二元组。
步骤4:可选去重
如果原列表存在重复元素,会生成重复的二元组,可通过集合去重得到唯一结果。
代码示例(Python)
from itertools import permutations, product def get_all_tuple(input_list): n = len(input_list) result = set() # 遍历所有拆分方式,mask每一位代表对应下标的元素归属:1归第一组,0归第二组 for mask in range(1, (1 << n) - 1): group1 = [input_list[i] for i in range(n) if mask >> i & 1] group2 = [input_list[i] for i in range(n) if not (mask >> i & 1)] # 生成组1的所有拼接数值 nums1 = set(int(''.join(map(str, p))) for p in permutations(group1)) # 生成组2的所有拼接数值 nums2 = set(int(''.join(map(str, p))) for p in permutations(group2)) # 笛卡尔积生成二元组 for a, b in product(nums1, nums2): result.add((a, b)) return list(result) # 测试示例 test_list = [4,3,2,5] res = get_all_tuple(test_list) # 可验证示例中的(43,25)、(3,245)、(53,24)都在结果中 print((43,25) in res) # 输出True print((3,245) in res) # 输出True print((53,24) in res) # 输出True
补充说明
如果不需要考虑分组内的顺序(比如要求元素保留原列表的相对顺序拼接),只需要把全排列permutations的逻辑替换为按原顺序拼接即可,可大幅降低计算量。
内容的提问来源于stack exchange,提问作者dhananjay wadhavane
相关产品推荐
相关产品推荐

