Создать объект итератора с кортежами разного размера - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь создать алгоритм ветвления и привязки, для этого я хотел бы создать объект итератора, который хранит все возможные комбинации списка элементов размером от 0 до n.

Примите следующееПример для демонстрации:

import itertools as it

list_tmp = ['a', 'b', 'c', 'd']

tmp_it = sum([list(map(list, it.combinations(list_tmp, i))) for i in range(2 + 1)], [])

tmp_it - это список всех возможных комбинаций размера от 0 до 2. Этот код отлично работает для небольших списков, но мне нужно действовать в большем списке, и поэтому я хотел бысохранить характеристики итератора объекта it.combination (генерировать комбинации на лету).Например,

for iteration in it.combinations(list_tmp, 2):
    print(iteration)

Есть ли способ сделать это для комбинаций нескольких размеров?Вместо преобразования в список и потери характеристик объекта итератора.

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

Вы можете сделать это, используя itertools.chain.from_iterable , который лениво оценивает свой аргумент. Примерно так:

tmp_it = it.chain.from_iterable(it.combinations(list_tmp, i) for i in range(2+1)))
2 голосов
/ 24 апреля 2019

Вы можете цепочка итераторы:

>>> sizes = it.chain.from_iterable(it.combinations(list_tmp, i) for i in range(len(list_tmp)))
>>> for i in sizes:
...     print(i)
... 
()
('a',)
('b',)
('c',)
('d',)
('a', 'b')
('a', 'c')
('a', 'd')
('b', 'c')
('b', 'd')
('c', 'd')
('a', 'b', 'c')
('a', 'b', 'd')
('a', 'c', 'd')
('b', 'c', 'd')
...