【发布时间】:2018-07-14 23:05:47
【问题描述】:
给定一个列表和排除元素,是否可以忽略包含这些元素的组合计算?
示例 1
给定l = [1, 2, 3, 4, 5],我想在计算之前计算size 4 的所有组合,并排除包含(1, 3) 的组合。
结果是:
All results: Wanted results:
[1, 2, 3, 4] [1, 2, 4, 5]
[1, 2, 3, 5] [2, 3, 4, 5]
[1, 2, 4, 5]
[1, 3, 4, 5]
[2, 3, 4, 5]
所有包含 1 和 3 的组合均已删除。
示例 2
@Eric Duminil 建议
l = [1, 2, 3, 4, 5, 6]、size 4 和
- 不包括第二列中的
(1, 2, 3) -
不包括第三列中的
(1, 2)All results: Wanted results 1 Wanted results 2 (Excluding [1, 2, 3]): (Excluding [1, 2]) [1, 2, 3, 4] [1, 2, 4, 5] [1, 3, 4, 5] [1, 2, 3, 5] [1, 2, 4, 6] [1, 3, 4, 6] [1, 2, 3, 6] [1, 2, 5, 6] [1, 3, 5, 6] [1, 2, 4, 5] [1, 3, 4, 5] [1, 4, 5, 6] [1, 2, 4, 6] [1, 3, 4, 6] [2, 3, 4, 5] [1, 2, 5, 6] [1, 3, 5, 6] [2, 3, 4, 6] [1, 3, 4, 5] [1, 4, 5, 6] [2, 3, 5, 6] [1, 3, 4, 6] [2, 3, 4, 5] [2, 4, 5, 6] [1, 3, 5, 6] [2, 3, 4, 6] [3, 4, 5, 6] [1, 4, 5, 6] [2, 3, 5, 6] [2, 3, 4, 5] [2, 4, 5, 6] [2, 3, 4, 6] [3, 4, 5, 6] [2, 3, 5, 6] [2, 4, 5, 6] [3, 4, 5, 6]
所有包含 1 和 2 和 3 的组合都已从想要的结果 1 中删除
所有包含 1 和 2 的组合都已从想要的结果 2 中删除
我有更大的组合要计算,但这需要很多时间,我想使用这些排除项来减少这个时间。
尝试过的解决方案
使用方法1,仍然计算组合
使用方法2,我尝试修改combinations function,但在计算之前我找不到合适的方法来忽略我的排除列表。
Method 1 | Method 2
|
def main(): | def combinations(iterable, r):
l = list(range(1, 6)) | pool = tuple(iterable)
comb = combinations(l, 4) | n = len(pool)
| if r > n:
for i in comb: | return
if set([1, 3]).issubset(i): | indices = list(range(r))
continue | yield tuple(pool[i] for i in indices)
else | while True:
process() | for i in reversed(range(r)):
| if indices[i] != i + n - r:
| break
| else:
| return
| indices[i] += 1
| for j in range(i+1, r):
| indices[j] = indices[j-1] + 1
| yield tuple(pool[i] for i in indices)
编辑:
首先,谢谢大家的帮助,我忘了提供更多关于约束的细节。
输出的顺序不相关,例如,如果结果是
[1, 2, 4, 5] [2, 3, 4, 5]或[2, 3, 4, 5] [1, 2, 4, 5],则不重要。组合的元素应该(如果可能的话)排序,
[1, 2, 4, 5] [2, 3, 4, 5]而不是[2, 1, 5, 4] [3, 2, 4, 5],但这并不重要,因为组合可以在之后排序。排除列表是不应出现组合一起的所有项目的列表。例如,如果我的排除列表是
(1, 2, 3),则不应计算包含 1 和 2 和 3 的所有组合。但是,允许使用 1 和 2 而不是 3 的组合。在这种情况下,如果我排除包含(1, 2)和(1, 2, 3)的组合,那将完全没有用,因为将由(1, 2, 3)过滤的所有组合都已由(1, 2)过滤多个排除列表必须是可能的,因为我对我的组合使用了多个约束。
测试答案
@tobias_k
此解决方案将排除列表 (1, 2, 3) 视为 OR 排除含义,如果我理解良好,将排除 (1, 2), (2, 3) and (1, 3),这在一个案例中很有用,但不适用于我当前的问题,我修改了问题以提供更多详细信息,抱歉造成混淆。在您的回答中,我不能仅使用列表 (1, 2) 和 (1, 3) 作为您指定的排除项。然而,这种解决方案的一大优势是允许多重排除。
@Kasramvd 和 @mikuszefski 您的解决方案非常接近我想要的,如果它确实包含多个排除列表,那就是答案。
谢谢
【问题讨论】:
-
您是否需要按照您在问题中描述的方式对输出元素进行排序?
-
你能补充一点关于排他性约束的内容吗?如果你有一组三个独占号码,这是否意味着你只能拥有这三个中的一个,或者你可以拥有两个?你能有像“只有 1 和 3 中的一个,只有 1 和 5 中的一个,但 3 和 5 还可以”这样的约束吗?
-
l = [1, 2, 3, 4, 5, 6]、size 4和不包括(1, 2, 3)的结果应该是什么?
标签: python python-3.x combinations itertools