Перестановки 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)

который, конечно, выдает только один набор значений True False и может выдавать более одного значения True, чего я не хочу. Я также пытался построить операторы if, но продолжаю сталкиваться с тупиками.

У кого-нибудь есть идеи о том, как это сделать? Темы с подобным вопросом пока не видел.

Спасибо


Обновлено: думаю, я, возможно, упростил свои вопросы, поэтому опубликую более сложный пример.

outcome_value=['A','B','C','D','E','F']
outcome_type=[True,False]

Я ищу все возможные перестановки True и False, но хочу указать такие условия, как:

  1. output_type A не должен совпадать с output_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)]

Надеюсь, это имеет смысл.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
157
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я не уверен, что вы охватываете все случаи в своем вопросе, но если вы ищете только одно истинное значение в трио для каждой позиции, вы можете сделать это:

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)]

Это достаточно просто, но я подозреваю, что в этом есть нечто большее. Учитывая, что вы запросили полный список, случайный выбор не должен иметь значения.

Это кажется разумным подходом. Однако здесь я получил другие результаты:

Daniel Hao 19.12.2020 22:43

Исправлено, я не понимал, что True и False были инвертированы в output_type

Alain T. 19.12.2020 22:46

спасибо, я получаю два значения True, когда запускаю вышеописанное? [(False, True, True), (True, False, True), (True, True, False)]... не думаю, что это сработает в любом случае, поскольку, если я хочу расширить список (т.е. добавить D, E, F и т. д.) для каждого будет более одного значения True и False. Поэтому я больше ищу конкретный код, который распознает значения, чтобы, если сказать A = True, затем установить B, C в False, но другие все равно могут быть либо истинными, либо ложными.

python_beginner 19.12.2020 22:50

ты его скопировал после исправления? (outcome_type[t!=p]) Я попробовал еще раз, и он работает, как указано

Alain T. 19.12.2020 22:54

Вы имеете в виду вот так?

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)]

Другие вопросы по теме