У меня есть список итерируемых объектов, и я заинтересован в получении всех списков, которые состоят из 0 или 1 элементов из каждого итерабельного (порядок неважен, поэтому это комбинации не перестановок Я ищу).Элегантный способ получения комбинаций для списка итераций
У меня действительно неэффективная реализация, которую я опубликовал ниже.
Я убежден, что есть более элегантный способ сделать это, возможно, с модулем itertools
, но я ничего не могу придумать. Любой совет?
import itertools
def all_subsets(ss):
subset_lens = range(0, len(ss) + 1)
list_of_subsets = map(lambda n: itertools.combinations(ss, n), subset_lens)
return itertools.chain.from_iterable(list_of_subsets)
list_of_iterables = [["A1"], ["B1", "B2", "B3"], ["C1", "C2"]]
all_possibilities = itertools.chain.from_iterable(itertools.product(*subset)
for subset in all_subsets(list_of_iterables))
# Visual representation of the desired result
for eg in all_possibilities:
print eg
Результат:
()
('A1',)
('B1',)
('B2',)
('B3',)
('C1',)
('C2',)
('A1', 'B1')
('A1', 'B2')
('A1', 'B3')
('A1', 'C1')
...
Вам просто интересно отображать результаты или вы также хотите сохранить комбинации? –
@ Edgar, я буду делать что-то еще с результатами, выходящими за рамки этого вопроса, поэтому мне нужно хранить, а не печатать. Визуальное представление - это просто помощь в объяснении моей проблемы! –