2

我有一个包含以下元素的列表:A,B,C,D,E,F,G.
它们要么假设为真,要么假设为假,因此分别由1和表示0

我应该得到一个组合,但以下限制仍然存在:

  1. 元素C和 F are to be true in all cases, ie,1`。
  2. 当 elementA为 true 时, elementEG可以为 false。
  3. 当元素B为真时,元素D可以为假。
4

1 回答 1

1

你想要的不是排列,而是产品。另外,我将限制解释为:

  1. C 和 F 不能为
  2. 如果 A 为false,则 E 和 G 不能为false
  3. 如果 B 为,则 D 不能为

这样,代码如下:

import pprint
from itertools import product

def myproduct():
    keys = 'abcdefg'
    values = [(0, 1) for k in keys]

    for value in product(*values):
        d = dict(zip(keys, value))
        # Skip: C and F that are 0 (False)
        if d['c'] == 0 or d['f'] == 0:
            continue

        # Skip: When A is false, E and G cannot be false
        if d['a'] == 0 and (d['e'] == 0 or d['g'] == 0):
            continue

        # Skip: When B is false, D cannot be false
        if d['b'] == 0 and d['d'] == 0:
            continue

        yield d  # This 'permutation' is good

for d in myproduct():
    pprint.pprint(d)

输出:

{'a': 0, 'b': 0, 'c': 1, 'd': 1, 'e': 1, 'f': 1, 'g': 1}
{'a': 0, 'b': 1, 'c': 1, 'd': 0, 'e': 1, 'f': 1, 'g': 1}
{'a': 0, 'b': 1, 'c': 1, 'd': 1, 'e': 1, 'f': 1, 'g': 1}
{'a': 1, 'b': 0, 'c': 1, 'd': 1, 'e': 0, 'f': 1, 'g': 0}
{'a': 1, 'b': 0, 'c': 1, 'd': 1, 'e': 0, 'f': 1, 'g': 1}
{'a': 1, 'b': 0, 'c': 1, 'd': 1, 'e': 1, 'f': 1, 'g': 0}
{'a': 1, 'b': 0, 'c': 1, 'd': 1, 'e': 1, 'f': 1, 'g': 1}
{'a': 1, 'b': 1, 'c': 1, 'd': 0, 'e': 0, 'f': 1, 'g': 0}
{'a': 1, 'b': 1, 'c': 1, 'd': 0, 'e': 0, 'f': 1, 'g': 1}
{'a': 1, 'b': 1, 'c': 1, 'd': 0, 'e': 1, 'f': 1, 'g': 0}
{'a': 1, 'b': 1, 'c': 1, 'd': 0, 'e': 1, 'f': 1, 'g': 1}
{'a': 1, 'b': 1, 'c': 1, 'd': 1, 'e': 0, 'f': 1, 'g': 0}
{'a': 1, 'b': 1, 'c': 1, 'd': 1, 'e': 0, 'f': 1, 'g': 1}
{'a': 1, 'b': 1, 'c': 1, 'd': 1, 'e': 1, 'f': 1, 'g': 0}
{'a': 1, 'b': 1, 'c': 1, 'd': 1, 'e': 1, 'f': 1, 'g': 1}

笔记:

  • values是一个列表(0, 1)

    [(0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1)]
    
  • 每个value都是 7 个数字的元组,例如:

    (1, 1, 1, 0, 0, 1, 0)
    
  • d是一个字典,其中键是ab,...,值是01

于 2015-11-28T17:05:26.053 回答