Python 创建资源组合

Python 创建资源组合,python,itertools,Python,Itertools,我们有一些航班可以分配给不同的抵达者,如下所示: Dep1.arrivals = [A1, A2] Dep2.arrivals = [A2, A3, A4] Dep3.arrivals = [A3, A5] 此函数的输出应该是一个列表,其中包含所有可能的到达组合: 输出:[[A1,A2,A3],[A1,A2,A5],[A1,A3,A5],[A1,A4,A5],…] 请注意,[A1,A3,A3]不包含在列表中,因为您不能两次使用到达。还要注意,[A1,A2,A3]与[A3,A1,A2]或[A3,

我们有一些航班可以分配给不同的抵达者,如下所示:

Dep1.arrivals = [A1, A2]
Dep2.arrivals = [A2, A3, A4]
Dep3.arrivals = [A3, A5]
此函数的输出应该是一个列表,其中包含所有可能的到达组合:

输出:[[A1,A2,A3],[A1,A2,A5],[A1,A3,A5],[A1,A4,A5],…]

请注意,[A1,A3,A3]不包含在列表中,因为您不能两次使用到达。还要注意,[A1,A2,A3]与[A3,A1,A2]或[A3,A2,A1]是相同的元素

编辑: 在这种情况下,给出的许多解决方案都有效,但不能作为一般解决方案,例如,如果3组或到达数相等:

Dep1.arrivals = [A1, A2, A3]
Dep2.arrivals = [A1, A2, A3]
Dep3.arrivals = [A1, A2, A3]
然后返回:

('A1', 'A2', 'A3')
('A1', 'A3', 'A2')
('A2', 'A1', 'A3')
('A2', 'A3', 'A1')
('A3', 'A1', 'A2')
('A3', 'A2', 'A1')
这是错误的,因为“A1”、“A2”、“A3”和“A3”、“A2”、“A1”是相同的解决方案

无论如何谢谢你

您可以使用产品生成所有可能的偏离组合,然后过滤出包含重复项的组合:

import itertools

arrivals = [
    ["A1", "A2"],
    ["A2", "A3", "A4"],
    ["A3", "A5"]
]

for items in itertools.product(*arrivals):
    if len(set(items)) < len(arrivals): continue
    print items

这个问题被标记为itertools,但我怀疑您没有查看itertools.compositions

您可以使用以下工具执行此操作:

后果 注意,这在概念上等同于@Kevin给出的代码

编辑:正如OP在他的编辑中提到的,当组合顺序不同时,此解决方案不起作用

为了解决这个问题,可以将最后一条语句更改为以下内容,其中我们首先获得一个已排序的到达元组列表,然后将该列表转换为一个集合,如下所示:

>>> lol = [["A1", "A2", "A3"], ["A1", "A2", "A3"], ["A1", "A2", "A3"]]
>>> set([tuple(sorted(x)) for x in itertools.product(*lol) if len(set(x)) == len(lol)])
{('A1', 'A2', 'A3')}

>>> lol = [["A1", "A2"], ["A2", "A3", "A4"], ["A3", "A5"]]
>>> set([tuple(sorted(x)) for x in itertools.product(*lol) if len(set(x)) == len(lol)])
{('A1', 'A2', 'A3'),
 ('A1', 'A2', 'A5'),
 ('A1', 'A3', 'A4'),
 ('A1', 'A3', 'A5'),
 ('A1', 'A4', 'A5'),
 ('A2', 'A3', 'A4'),
 ('A2', 'A3', 'A5'),
 ('A2', 'A4', 'A5')}

既然你找不到pythonic解决方案,那么非python解决方案呢?你朝那个方向试了什么?你真的往里面看了吗?!我不认为你的第二个结果‘A1’、‘A2’、‘A4’是一个有效的组合,因为A4不在第三批到达者名单中。OP不是要求从单个列表中获得3组到达,而是要求从3组到达进行组合,其中组合中的所有实体都不同。我编辑了我的问题,因为它在某些情况下给出了错误的解决方案。无论如何谢谢你@DWeiss23捕捉不错,更新了我的答案,检查编辑。如果答案有帮助,不要忘记接受:哇!不错!我第一次通过stackoverflow.com问这个问题,效果很好!谢谢顺便说一句,我接受了你的答案。为什么它有用呢?@DWeiss23你的意思是?几乎就是我想要的,但在某些情况下它给出了错误的解决方案。我编辑了我的问题来展示它。无论如何谢谢你!
arrivals = ['A1', 'A2', 'A3', 'A4']
[a for a in itertools.combinations(arrivals, 3)]
#[('A1', 'A2', 'A3'),
#('A1', 'A2', 'A4'),
# ('A1', 'A3', 'A4'),
#('A2', 'A3', 'A4')]
>>> import itertools
>>> lol = [["A1", "A2"], ["A2", "A3", "A4"], ["A3", "A5"]]
>>> print [x for x in itertools.product(*lol) if len(set(x)) == len(lol)]
[('A1', 'A2', 'A3'),
 ('A1', 'A2', 'A5'),
 ('A1', 'A3', 'A5'),
 ('A1', 'A4', 'A3'),
 ('A1', 'A4', 'A5'),
 ('A2', 'A3', 'A5'),
 ('A2', 'A4', 'A3'),
 ('A2', 'A4', 'A5')]
>>> lol = [["A1", "A2", "A3"], ["A1", "A2", "A3"], ["A1", "A2", "A3"]]
>>> set([tuple(sorted(x)) for x in itertools.product(*lol) if len(set(x)) == len(lol)])
{('A1', 'A2', 'A3')}

>>> lol = [["A1", "A2"], ["A2", "A3", "A4"], ["A3", "A5"]]
>>> set([tuple(sorted(x)) for x in itertools.product(*lol) if len(set(x)) == len(lol)])
{('A1', 'A2', 'A3'),
 ('A1', 'A2', 'A5'),
 ('A1', 'A3', 'A4'),
 ('A1', 'A3', 'A5'),
 ('A1', 'A4', 'A5'),
 ('A2', 'A3', 'A4'),
 ('A2', 'A3', 'A5'),
 ('A2', 'A4', 'A5')}