Я не уверен, что есть особенно элегантный способ. Концептуально вам необходимо вычислить набор мощности необязательных элементов, но объединить его с необязательными элементами таким образом, чтобы удовлетворить ваши требования. Вот один из способов:
import itertools
a = [('a', True), ('b', False), ('c', True), ('d', False)]
optional_count = sum(optional for x, optional in a)
for include in itertools.product([True, False], repeat=optional_count):
include_iter = iter(include)
print([
(x, optional)
for x, optional in a
if not optional or next(include_iter)
])
печать
[('a', True), ('b', False), ('c', True), ('d', False)]
[('a', True), ('b', False), ('d', False)]
[('b', False), ('c', True), ('d', False)]
[('b', False), ('d', False)]
Цикл повторяется по всем кортежам, указывая, включать ли дополнительные элементы:
True, True
True, False
False, True
False, False
Понимание списка в операторе печати включает в себя все необязательные элементы, а для необязательных просматривает следующий доступный элемент из include
.