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

如何在Python3中获取集合列表的跨集合元组排列(排除同集合元组)

解法一:用filter过滤所有元组排列

要实现需求,首先得给每个元组标记它所属的集合,这样才能判断两个元组是否来自同一集合,具体步骤如下:

  1. 给每个元组绑定所属集合的索引标记:
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))
  1. 生成所有元组的排列,再用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:10:47