python как составлять последовательные комбинации - PullRequest
1 голос
/ 12 февраля 2020

У меня есть вопрос. Я пробовал это, как в примере ниже.

import itertools

options = ['A', 'B', 'C']

true_or_false = ['true', 'false']

result1 = [f"{option} is " for option in options]

Результаты выглядят следующим образом.

print(result1)
['A is ', 'B is ', 'C is ']

Я хочу использовать «true_or_false» для получения результата2, подобного этому.

('A is true' 'B is true' 'C is true')
('A is true' 'B is true' 'C is false')
('A is true' 'B is false' 'C is true')
('A is true' 'B is false' 'C is false')
('A is false' 'B is true' 'C is true')
('A is false' 'B is true' 'C is false')
('A is false' 'B is false' 'C is true')
('A is false' 'B is false' 'C is false')

Я думаю, что он использует "комбинации", но он не работает.

Ответы [ 3 ]

2 голосов
/ 12 февраля 2020

Вы можете использовать itertools.product с аргументом repeat и zip:

>>> [ tuple(opt + ' is ' + val for opt, val in zip(options, values))
...   for values in itertools.product(true_or_false, repeat=len(options)) ]
[('A is true', 'B is true', 'C is true'),
 ('A is true', 'B is true', 'C is false'),
 ('A is true', 'B is false', 'C is true'),
 ('A is true', 'B is false', 'C is false'),
 ('A is false', 'B is true', 'C is true'),
 ('A is false', 'B is true', 'C is false'),
 ('A is false', 'B is false', 'C is true'),
 ('A is false', 'B is false', 'C is false')]
2 голосов
/ 12 февраля 2020

Простые вложенные циклы могут выводить то, что вам нужно

result2 = []
true_or_false = ['true','false']
for a in true_or_false:
    for b in true_or_false:
        for c in true_or_false:
            result2.append(('A is ' + a, 'B is ' + b, 'C is ' + c))

И result2 будет списком кортежей:

[('A is true', 'B is true', 'C is true'),
 ('A is true', 'B is true', 'C is false'),
 ('A is true', 'B is false', 'C is true'),
 ('A is true', 'B is false', 'C is false'),
 ('A is false', 'B is true', 'C is true'),
 ('A is false', 'B is true', 'C is false'),
 ('A is false', 'B is false', 'C is true'),
 ('A is false', 'B is false', 'C is false')]
1 голос
/ 12 февраля 2020

Если вы ищете что-то лаконичное.

import pprint

options = ['A', 'B', 'C']
true_or_false = ['true', 'false']

result2 = []
[result2.append(('A is ' + a, 'B is ' + b, 'C is ' + c)) for a in true_or_false for b in true_or_false for c in
 true_or_false]

pprint.pprint(result2)

Выход:

[('A is true', 'B is true', 'C is true')
 ('A is true', 'B is true', 'C is false'),
 ('A is true', 'B is false', 'C is true'),
 ('A is true', 'B is false', 'C is false'),
 ('A is false', 'B is true', 'C is true'),
 ('A is false', 'B is true', 'C is false'),
 ('A is false', 'B is false', 'C is true'),
 ('A is false', 'B is false', 'C is false')]
...