Python 排列 - 获得带条件的全套结果
Python Permutations - Obtaining full set of outcomes with conditions
我有以下采用布尔值的变量列表:
outcome_value=['A','B','C']
outcome_type=[True,False]
我想获取三个变量的可能结果的完整列表。
我想要的条件是当 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)
这当然只会产生一组 True False 值,并且可以产生多个我不想要的 True 值。我也一直在尝试构建 if 语句,但将 运行 留在了死胡同里。
有没有人知道如何做到这一点?还没有看到有类似问题的帖子。
谢谢
编辑:我想我的问题可能过于简单化了,所以 post 一个更复杂的例子
outcome_value=['A','B','C','D','E','F']
outcome_type=[True,False]
我正在寻找 True 和 False 的所有可能排列,但想指定条件,例如:
A的outcome_type不能等于B的outcome_type,C和D,E和F也一样
如果 A=True,则 C、E 必须等于 False(此外还满足 B 的条件 1)
if C=True, A,E=False(除了满足 D 的条件 1)
if E=True, A,C=False(除了满足 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)]
这很简单,但我怀疑它的含义远不止于此。鉴于您请求的是 完整 列表,随机不应发挥作用。
你的意思是这样?
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)]
您可以通过过滤掉笛卡尔积来获取值列表:
from itertools import product
outcomes_all = list(filter(
lambda x: sum(x) == 1,
product(outcome_type, repeat=3)
))
这将是输出:
>>> outcomes_all
[(True, False, False), (False, True, False), (False, False, True)]
我有以下采用布尔值的变量列表:
outcome_value=['A','B','C']
outcome_type=[True,False]
我想获取三个变量的可能结果的完整列表。 我想要的条件是当 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)
这当然只会产生一组 True False 值,并且可以产生多个我不想要的 True 值。我也一直在尝试构建 if 语句,但将 运行 留在了死胡同里。
有没有人知道如何做到这一点?还没有看到有类似问题的帖子。
谢谢
编辑:我想我的问题可能过于简单化了,所以 post 一个更复杂的例子
outcome_value=['A','B','C','D','E','F']
outcome_type=[True,False]
我正在寻找 True 和 False 的所有可能排列,但想指定条件,例如:
-
A的
outcome_type不能等于B的outcome_type,C和D,E和F也一样
如果 A=True,则 C、E 必须等于 False(此外还满足 B 的条件 1)
if C=True, A,E=False(除了满足 D 的条件 1)
if E=True, A,C=False(除了满足 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)]
这很简单,但我怀疑它的含义远不止于此。鉴于您请求的是 完整 列表,随机不应发挥作用。
你的意思是这样?
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)]
您可以通过过滤掉笛卡尔积来获取值列表:
from itertools import product
outcomes_all = list(filter(
lambda x: sum(x) == 1,
product(outcome_type, repeat=3)
))
这将是输出:
>>> outcomes_all
[(True, False, False), (False, True, False), (False, False, True)]