如何在Python3中获取集合列表的跨集合元组排列(排除同集合元组)
解法一:用
filter过滤所有元组排列 要实现需求,首先得给每个元组标记它所属的集合,这样才能判断两个元组是否来自同一集合,具体步骤如下:
- 给每个元组绑定所属集合的索引标记:
from itertools import permutations list_1 = [{(3, 4), (3, 1), (3, 3), (3, 2), (3, 5)}, {(9, 10), (9, 7), (9, 8), (9, 9)}, {(2, 9), (3, 9), (1, 9)}, {(6, 2), (5, 2)}, {(8, 3)}] # 把元组和它所在集合的索引打包 tuples_with_group = [] for group_idx, group in enumerate(list_1): for tup in group: tuples_with_group.append((group_idx, tup))
- 生成所有元组的排列,再用
filter排除同集合的情况:
# 生成所有元组的两两有序排列 all_tuple_perms = permutations(tuples_with_group, 2) # 过滤掉两个元组来自同一集合的结果 valid_perms = filter(lambda pair: pair[0][0] != pair[1][0], all_tuple_perms) # 提取出纯元组对(去掉索引标记) valid_tuple_pairs = [(p[0][1], p[1][1]) for p in valid_perms]
这种方法逻辑直观,但如果集合内元组数量较多,先生成所有排列再过滤会浪费资源,因为会产生大量不符合要求的同集合元组对。
解法二:更高效的直接生成法
既然只需要不同集合间的元组对,不如直接从源头生成符合要求的结果:先找出所有不同的集合有序对,再生成对应集合内元组的笛卡尔积,避免无用的同集合元组对生成。
from itertools import permutations, product list_1 = [{(3, 4), (3, 1), (3, 3), (3, 2), (3, 5)}, {(9, 10), (9, 7), (9, 8), (9, 9)}, {(2, 9), (3, 9), (1, 9)}, {(6, 2), (5, 2)}, {(8, 3)}] # 生成所有不同集合的有序对(比如(s1,s2)和(s2,s1)都会被包含,满足排列要求) set_perms = permutations(list_1, 2) # 对每个集合对,生成所有元组的有序组合 valid_tuple_pairs = [] for set_a, set_b in set_perms: # product(set_a, set_b) 会生成所有 (t_a, t_b),其中t_a来自set_a,t_b来自set_b valid_tuple_pairs.extend(product(set_a, set_b))
这种方法无需过滤,直接生成目标结果,效率更高,适合元组数量较多的场景。
内容的提问来源于stack exchange,提问作者Niro
相关产品推荐
相关产品推荐

