Python 满足条件的不同列表元素的组合

Python 满足条件的不同列表元素的组合,python,list,combinations,Python,List,Combinations,下面是一个我希望实现的输入和之后的示例: a = [1,2,3,4] b = [2,3,6,8] c = [4,7,8,9] d = [4,8,9,10] 我的目标是找到n个元素的所有组合,以便结果包含每个列表中的一个或多个元素 n=3的结果示例 res = [[1,3,8],[2,3,8],...etc.] 到目前为止,我唯一能找到的方法就是使用比较法,当然,这种比较法非常奇怪且缓慢 任何帮助都将不胜感激 >>> import itertools >>>

下面是一个我希望实现的输入和之后的示例:

a = [1,2,3,4]
b = [2,3,6,8]
c = [4,7,8,9]
d = [4,8,9,10]
我的目标是找到n个元素的所有组合,以便结果包含每个列表中的一个或多个元素

n=3的结果示例

 res = [[1,3,8],[2,3,8],...etc.]
到目前为止,我唯一能找到的方法就是使用比较法,当然,这种比较法非常奇怪且缓慢

任何帮助都将不胜感激

>>> import itertools
>>> all_elements = {x for y in [a, b, c, d] for x in y}
>>> all_elements
{1, 2, 3, 4, 6, 7, 8, 9, 10}
>>> n = 3
# Find all n combinations of a set of the elements in all lists
>>> combos = set(itertools.combinations(all_elements, n))
>>> combos
{(3, 4, 6), (1, 4, 7), (1, 2, 8), (3, 8, 10), (2, 6, 9), (3, 6, 10), (3, 4, 7), (2, 3, 6), (1, 2, 9), (4, 6, 9), (2, 6, 8), (6, 8, 9), (1, 8, 9), (1, 2, 10), (2, 3, 7), (4, 6, 8), (7, 9, 10), (3, 6, 8), (4, 8, 10), (3, 6, 9), (1, 6, 8), (4, 6, 10), (4, 8, 9), (6, 8, 10), (2, 6, 7), (1, 7, 8), (1, 6, 9), (4, 7, 10), (6, 9, 10), (1, 6, 10), (3, 9, 10), (1, 8, 10), (2, 8, 9), (4, 7, 8), (3, 6, 7), (1, 3, 10), (4, 7, 9), (2, 7, 8), (1, 3, 9), (2, 4, 7), (3, 4, 8), (2, 7, 9), (1, 3, 8), (2, 4, 6), (2, 8, 10), (3, 4, 9), (1, 2, 3), (1, 6, 7), (2, 7, 10), (6, 7, 8), (7, 8, 9), (3, 4, 10), (6, 7, 9), (1, 2, 4), (2, 3, 4), (2, 9, 10), (7, 8, 10), (4, 9, 10), (6, 7, 10), (1, 4, 10), (2, 3, 8), (8, 9, 10), (1, 3, 7), (2, 4, 9), (1, 2, 6), (2, 3, 9), (3, 7, 9), (2, 4, 10), (1, 3, 6), (1, 7, 10), (1, 2, 7), (1, 4, 8), (2, 3, 10), (2, 4, 8), (1, 9, 10), (1, 7, 9), (3, 7, 8), (1, 4, 9), (1, 3, 4), (3, 8, 9), (1, 4, 6), (3, 7, 10), (4, 6, 7), (2, 6, 10)}
这是好东西。这种理解将仅保留满足以下条件的组合:
[a,b,c,d]
中的每个列表至少包含组合中的一个元素:

>>> res = {com for com in combos if all(any(val in arr for val in com) for arr in [a, b, c, d])}
请查看:

>>> res
{(3, 4, 6), (3, 8, 10), (1, 2, 8), (2, 6, 9), (3, 4, 7), (1, 2, 9), (4, 6, 9), (2, 6, 8), (1, 8, 9), (4, 6, 8), (1, 4, 6), (3, 6, 8), (4, 8, 10), (3, 6, 9), (1, 6, 8), (4, 6, 10), (4, 8, 9), (1, 6, 9), (3, 9, 10), (1, 3, 4), (2, 8, 9), (4, 7, 8), (2, 7, 8), (1, 3, 9), (2, 4, 7), (3, 4, 8), (2, 7, 9), (1, 3, 8), (2, 4, 6), (2, 8, 10), (3, 4, 9), (2, 7, 10), (3, 4, 10), (1, 2, 4), (2, 3, 4), (2, 9, 10), (2, 3, 8), (2, 4, 9), (2, 3, 9), (3, 7, 9), (2, 4, 10), (2, 4, 8), (1, 4, 8), (3, 7, 8), (1, 7, 8), (3, 8, 9), (1, 8, 10), (3, 7, 10), (4, 6, 7)}

不清楚“查找n个元素的所有组合,使结果包含每个列表的一个或多个元素”是什么意思。您是说希望每个结果列表包含前n个列表中的一个元素吗?重复元素呢?考虑使用集合运算<代码>e=集合(a).联合(b)e=集合(e).联合(c)
e=集合(e).联合(d)
。这将给出一组唯一的值“[1,2,3,4,6,7,8,9,10]”,并从中使用您的条件。您甚至可以在集合中执行交集和差分操作以获得公共值和不同值,而不是迭代过程和逐个元素比较。@Varad一种更简洁的方法是
{x for y in[a,b,c,d]for x in y}
。非常感谢。我现在尝试在代码中实现。我正在使用元组列表,但我认为结果也会起作用。顺便说一句,我很抱歉语法不好,但是你猜对了,我在寻找每个数组中至少一个元素。谢谢你,当然可以。如果你高兴的话,请随意接受这个答案:)这使生活比集合论更容易☺@Varad它与使用集合交点没有太大区别。。。这样写这个解决方案真的很容易。