Python置换-通过条件获得完整的结果集

Python置换-通过条件获得完整的结果集,python,random,permutation,Python,Random,Permutation,我有以下采用布尔值的变量列表: outcome_value=['A','B','C'] 我想获得三个变量可能结果的完整列表。 我想要的条件是:A=True,然后是B,C=False;当B=True时,其他值等于False,以此类推。换言之: outcomes_all = [(True, False, False), (False, True, False), (False, False, True)] 我可以使用什么代码来获取上述信息?请注意,这是我希望做的事情的简化,我希望得到可以用来扩展

我有以下采用布尔值的变量列表:

outcome_value=['A','B','C']
我想获得三个变量可能结果的完整列表。 我想要的条件是:A=True,然后是B,C=False;当B=True时,其他值等于False,以此类推。换言之:

outcomes_all = [(True, False, False), (False, True, False), (False, False, True)]
我可以使用什么代码来获取上述信息?请注意,这是我希望做的事情的简化,我希望得到可以用来扩展到更复杂的结果列表的代码

到目前为止,我唯一能想到的是

import random
        for o in outcome_value:
            p=random.choice(outcome_type)
            print(p)
当然,它只会产生一组真值和假值,并且可以产生多个我不想要的真值。我也一直在尝试构建if语句,但一直在使用它

有人对如何做到这一点有什么想法吗?还没有看到任何类似问题的线索

谢谢


编辑:thinkI可能过于简化了我的问题,因此将发布一个更复杂的示例

outcome_value=['A','B','C','D','E','F']
我正在寻找所有可能的真与假排列,但希望指定以下条件:

  • A的结果类型不得等于B的结果类型,C和D、E和F的结果类型相同

  • 如果A=真,那么C,E必须等于假(除了也满足B的条件1)

  • 如果C=真,A,E=假(除了也满足D的条件1)

  • 如果E=真,A,C=假(除满足F的条件1外)

  • 因此,最终结果如下:

    [(True, False, False, True ,False ,True), (False, True, False, False, False ,True), (False, False, True, True, True, False)]
    

    希望这是有意义的。

    我不确定你的问题是否涵盖了所有情况,但如果你只想在每个职位的三个职位中寻找一个真正的价值,你可以这样做:

    outcome_value = ['A','B','C']
    outcome_type  = [True,False]
    
    outcomes_all = [ tuple(outcome_type[t!=p] for t in outcome_value) for p in outcome_value ]
    
    # [(True, False, False), (False, True, False), (False, False, True)]
    

    这很简单,但我怀疑还有更多。鉴于您要求提供完整的列表,random不应发挥作用。

    我不确定您是否涵盖了问题中的所有情况,但如果您只在每个职位的三个选项中寻找一个真实值,您可以这样做:

    outcome_value = ['A','B','C']
    outcome_type  = [True,False]
    
    outcomes_all = [ tuple(outcome_type[t!=p] for t in outcome_value) for p in outcome_value ]
    
    # [(True, False, False), (False, True, False), (False, False, True)]
    
    这很简单,但我怀疑还有更多。鉴于您要求提供完整的列表,random不应该起作用。

    您的意思是这样吗

    import itertools
    outcome_value=['A','B','C']
    
    outcome_value = False,False,True
    
    combin = itertools.permutations(outcome_value,3)
    
    print(list(combin))
    
    这是输出

    [(False, False, True), (False, True, False), (False, False, True), (False, True, False), (True, False, False), (True, False, False)]
    
    你是说像这样

    import itertools
    outcome_value=['A','B','C']
    
    outcome_value = False,False,True
    
    combin = itertools.permutations(outcome_value,3)
    
    print(list(combin))
    
    这是输出

    [(False, False, True), (False, True, False), (False, False, True), (False, True, False), (True, False, False), (True, False, False)]
    

    您可以通过过滤掉笛卡尔积来获得值列表:

    来自itertools导入产品的
    
    结果\u全部=列表(过滤器(
    λx:和(x)=1,
    产品(结果类型,重复=3)
    ))
    
    这就是输出:

    >>结果\u所有
    [(真,假,假),(假,真,假),(假,假,真)]
    
    您可以通过过滤掉笛卡尔积来获得值列表:

    来自itertools导入产品的
    
    结果\u全部=列表(过滤器(
    λx:和(x)=1,
    产品(结果类型,重复=3)
    ))
    
    这就是输出:

    >>结果\u所有
    [(真,假,假),(假,真,假),(假,假,真)]
    
    这似乎是一种明智的做法。但是,我在这里得到了不同的结果:?[(False,True,True),(True,False,True),(True,True,False)]修复,我没有意识到结果中的True和False是颠倒的。谢谢,我运行上述操作时得到了两个真值?[(False,True,True),(True,False,True),(True,True,False)]…我不认为这会起作用,因为如果我想扩展列表(即添加D、E、F等),每个列表将有多个True和False值。因此,我更喜欢寻找能够识别这些值的特定代码,因此如果说A=True,那么就将B、C设置为False,但其他代码可能仍然为True或False。修复后是否复制了它?(
    outcome\u type[t!=p]
    )我又试了一次,结果表明它可以正常工作。这似乎是一种明智的方法。但是,我在这里得到了不同的结果:?[(False,True,True),(True,False,True),(True,True,False)]修复,我没有意识到结果中的True和False是颠倒的。谢谢,我运行上述操作时得到了两个真值?[(False,True,True),(True,False,True),(True,True,False)]…我不认为这会起作用,因为如果我想扩展列表(即添加D、E、F等),每个列表将有多个True和False值。因此,我更喜欢寻找能够识别这些值的特定代码,因此如果说A=True,那么就将B、C设置为False,但其他代码可能仍然为True或False。修复后是否复制了它?(
    outcome\u type[t!=p]
    )我再次尝试了,结果如图所示