使用 Python 排列列表

Permute a list using Python

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

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

  1. 元素 C 和 Fare to be true in all cases, ie,1`.
  2. 当元素 A 为真时,元素 EG 可以为假。
  3. 当元素 B 为真时,元素 D 可以为假。

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

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

至此,代码如下:

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 是一个字典,其中的键是 a, b, ...值是 01