#python #random #permutation
#python #Случайный #перестановка
Вопрос:
У меня есть следующий список переменных, которые принимают логическое значение:
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)
который, конечно, создает только один набор истинных ложных значений и может выдавать более одного истинного значения, которое мне не нужно. Я также пытался создать операторы if, но продолжаю заходить в тупик с этим.
У кого-нибудь есть идеи о том, как это сделать? Еще не видел ни одной темы с подобным вопросом.
Спасибо
Редактировать: thinkI, возможно, упростил мои вопросы, поэтому опубликую более сложный пример
outcome_value=['A','B','C','D','E','F']
outcome_type=[True,False]
Я ищу все возможные перестановки True и False, но хочу указать такие условия, как:
- outcome_type для A не должен равняться outcome_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)]
Надеюсь, это имеет смысл.
Ответ №1:
Я не уверен, что вы охватываете все случаи в своем вопросе, но если вы ищете только одно истинное значение в трио для каждой позиции, вы можете сделать это:
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)]
Это достаточно просто, но я подозреваю, что это еще не все. Учитывая, что вы запросили полный список, случайность не должна вступать в игру.
Комментарии:
1. Это кажется разумным подходом. Однако здесь я получил разные результаты:? [(False, True, True), (True, False, True), (True, True, False)]
2. Исправлено, я не понял, что True и False были инвертированы в outcome_type
3. спасибо, я получаю два истинных значения, когда выполняю вышеуказанное? [(False, True, True), (True, False, True), (True, True, False)]… не думаю, что это сработает в любом случае, поскольку, если я захочу расширить список (т. Е. Добавить D, E, F и т. Д.), Для каждого будет более одного значения True и False. Поэтому я больше ищу конкретный код, который распознает значения, чтобы, если, скажем, A = True, затем установить B, C в False, но другие все равно могут быть либо true, либо false
4. вы скопировали его после исправления? (
outcome_type[t!=p]
) Я попробовал снова, и он работает, как указано
Ответ №2:
Вы можете получить список значений, отфильтровав декартово произведение:
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)]
Ответ №3:
Вы имеете в виду вот так?
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)]