2 ^ n具有高级过滤功能的Itertools组合

DNb*_*ter 7 python combinations permutation set

我知道我可以使用itertools抽出组合,并定义组合组的大小,如下所示:

import itertools
print list(itertools.combinations(['V','M','T','O','Q','K','D','R'], 4))
Run Code Online (Sandbox Code Playgroud)

这个输出就像一个元组列表,在这种情况下长度为4.

从这里,我想要做的是强制执行2个参数 - 1)排除包含某些对的任何组合/元组 - 例如V和M,或者Q和K. 2)强制每个元组只包含1个实例一封信.我相信itertools已经在做#2了.

应该保留的只是那些不包含任何这些预定"假"对的元组.因此,如果我排除了包含V和M的组,则该组('V','M','Q','D')将无效,但是('V','R','Q','D')有效.

这对我来说最好的方法是什么?

Pad*_*ham 1

我会用一组过滤:

import itertools
c = itertools.combinations(['V','M','T','O','Q','K','D','R'], 4)

st = {"V","M"}

print([co for co in c if not st.issubset(co)])
Run Code Online (Sandbox Code Playgroud)

如果你想过滤两个:

st1 = {"V","M"}
st2 = {"Q","K"}

print([co for co in c if not st1.issubset(co) and not st2.issubset(co)])
Run Code Online (Sandbox Code Playgroud)

如果您有两个以上,那么使用可能会更好any

sts = [{"V","M"},{"V","R"},{"T","O"}]

print([co for co in c if not any(st.issubset(co) for st in sts)])
Run Code Online (Sandbox Code Playgroud)

除非你推出自己的组合逻辑,否则你无法避免创建所有组合和过滤,即使你自己推出自己的组合逻辑,在纯Python中执行它可能会更慢,因为你有一个大数据集