Python 列表中不同元组元素的组合

Python 列表中不同元组元素的组合,python,tuples,combinatorics,Python,Tuples,Combinatorics,我有一个这样的元组列表:[(1,2,3),(2,4)](列表的长度和元组的长度可能不同),我希望从列表中的每个元组中获得至少包含一个元素的所有组合,但也要获得包含更多元素的组合 因此,结果应该在本例中: 最小的结果应包含与原始列表中元组数相等的元素数,最大的结果应包含元组中存在的所有元素 元素的顺序无关紧要,应该最终消除重复项(因此[1,2,3,2,4]=[1,2,3,4],并且应该只在结果中出现一次,类似地[3,2]=[2,3]等等),但我考虑过在创建整个列表后排序和/或消除重复项 最好的方

我有一个这样的元组列表:
[(1,2,3),(2,4)]
(列表的长度和元组的长度可能不同),我希望从列表中的每个元组中获得至少包含一个元素的所有组合,但也要获得包含更多元素的组合

因此,结果应该在本例中:

最小的结果应包含与原始列表中元组数相等的元素数,最大的结果应包含元组中存在的所有元素

元素的顺序无关紧要,应该最终消除重复项(因此
[1,2,3,2,4]=[1,2,3,4]
,并且应该只在结果中出现一次,类似地
[3,2]=[2,3]
等等),但我考虑过在创建整个列表后排序和/或消除重复项


最好的方法是什么?坦白地说,我甚至不知道如何正确地开始…

让我们用
X
Y
来表示这两个列表,它们的长度用
X |
Y |
来表示

电源组的长度为
2^ | X |
,电源组(Y)的长度为
2^ | Y |

因此,两个功率集的乘积具有长度
2^(| X |+| Y |)
。 对于本产品中的每一项,我们都需要将各个部分组合起来,取下集合(从部分中删除重复项)以形成一个新集合。然后,我们需要获取此集合的集合以从集合中删除重复项。必须获取完整集合的集合可能会占用大量内存,因为它需要立即在内存中保存完整集合

然而,我认为有一种更快的方法可以达到预期的最终结果。如果将
X
Y
组合成一组,
XY
,则
XY
的动力集长度
2^(| XY |)
。如果
X
Y
共享任何公共项,则此长度小于
2^(| X |+| Y |)
。因此,您可以为每个公共项节省2的系数

对于此电源集中的每个项目,我们只需检查是否有来自X的元素和来自Y的元素。收集所有这些项目,我们就完成了。因为结果可以由迭代器生成,所以工作量要小得多,内存占用也少


屈服

[(1, 2), (1, 4), (2, 3), (2, 4), (3, 4), (1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4), (1, 2, 3, 4)]

您需要L中项的幂集的笛卡尔积-除非其中任何项为空。一种方法是在构造powerset时只保留空元素

from itertools import product, combinations, chain
L = [(1, 2, 3), (2, 4)]
def powerset(iterable):
    "powerset minus the empty element"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(1, len(s)+1))

print [list(chain.from_iterable(c)) for c in product(*(powerset(x) for x in L))]
印刷品

[[1, 2], [1, 4], [1, 2, 4], [2, 2], [2, 4], [2, 2, 4], [3, 2], [3, 4], [3, 2, 4], [1, 2, 2], [1, 2, 4], [1, 2, 2, 4], [1, 3, 2], [1, 3, 4], [1, 3, 2, 4], [2, 3, 2], [2, 3, 4], [2, 3, 2, 4], [1, 2, 3, 2], [1, 2, 3, 4], [1, 2, 3, 2, 4]]

itertools
中的一些方法将是您最好的选择。我正在查看它们,但老实说,没有发现任何真正有用的方法(至少直接解决我的问题;-)。我在考虑将所有元组元素合并到一个长列表中,然后根据它们进行所有组合,最终从每个元组中删除那些不包含至少一个元素的元素。但我不确定这是不是最明智的方式。
[[1, 2], [1, 4], [1, 2, 4], [2, 2], [2, 4], [2, 2, 4], [3, 2], [3, 4], [3, 2, 4], [1, 2, 2], [1, 2, 4], [1, 2, 2, 4], [1, 3, 2], [1, 3, 4], [1, 3, 2, 4], [2, 3, 2], [2, 3, 4], [2, 3, 2, 4], [1, 2, 3, 2], [1, 2, 3, 4], [1, 2, 3, 2, 4]]