使用Python置换列表

时间:2015-11-28 16:22:38

标签: python loops permute

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

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

  1. 元素C和F are to be true in all cases, ie, 1`。
  2. 当元素A为true时,元素EG可能为false。
  3. 当元素B为true时,元素D可能为false。

1 个答案:

答案 0 :(得分:1)

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

  1. C和F不能 false
  2. 如果A false ,则E和G不能 false
  3. 如果B false ,则D不能 false
  4. 有了这个,代码如下:

    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 ,...并且值 0 1