У меня есть следующий список переменных, которые принимают логическое значение:
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, но продолжаю сталкиваться с тупиками.
У кого-нибудь есть идеи о том, как это сделать? Темы с подобным вопросом пока не видел.
Спасибо
Обновлено: думаю, я, возможно, упростил свои вопросы, поэтому опубликую более сложный пример.
outcome_value=['A','B','C','D','E','F']
outcome_type=[True,False]
Я ищу все возможные перестановки True и False, но хочу указать такие условия, как:
output_type A не должен совпадать с output_type B, одинаково для C и D, E и F
если A=True, то C,E должны равняться False (в дополнение к выполнению условия 1 для B)
если C=True, A,E=False (в дополнение к выполнению условия 1 для D)
если E=True, A,C=False (в дополнение к выполнению условия 1 для F)
Поэтому окончательный результат будет выглядеть следующим образом:
[(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)]
Это достаточно просто, но я подозреваю, что в этом есть нечто большее. Учитывая, что вы запросили полный список, случайный выбор не должен иметь значения.
Исправлено, я не понимал, что True и False были инвертированы в output_type
спасибо, я получаю два значения True, когда запускаю вышеописанное? [(False, True, True), (True, False, True), (True, True, False)]... не думаю, что это сработает в любом случае, поскольку, если я хочу расширить список (т.е. добавить D, E, F и т. д.) для каждого будет более одного значения True и False. Поэтому я больше ищу конкретный код, который распознает значения, чтобы, если сказать A = True, затем установить B, C в False, но другие все равно могут быть либо истинными, либо ложными.
ты его скопировал после исправления? (outcome_type[t!=p]
) Я попробовал еще раз, и он работает, как указано
Вы имеете в виду вот так?
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)]
Это кажется разумным подходом. Однако здесь я получил другие результаты: