Перестановки Python — получение полного набора результатов с условиями

#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, но хочу указать такие условия, как:

  1. outcome_type для A не должен равняться outcome_type для B, то же самое для C и D, E и F
  2. если A = True, то C, E должны быть равны False (в дополнение к условию 1 для B, которое также выполняется)
  3. если C = True, A, E = False (в дополнение к условию 1 для D, которое также выполняется)
  4. если 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)]