生成具有不同大小的元组的迭代器对象

时间:2019-04-24 09:42:00

标签: python itertools

我正在尝试创建分支和绑定算法,为此,我想创建一个迭代器对象,该对象存储大小为0到n的项目列表的所有可能组合。

以以下示例进行演示:

<form method="POST" action="/" enctype="multipart/form-data">
            <fieldset class="form-group">
            <div class="hueco col-xs-7">
                {{form.hidden_tag()}}
                {{form.id(class="form-control",placeholder="Id")}}
            </div>
            <div class="hueco col-xs-7">
                {{form.hidden_tag()}}
                {{form.nombre(class="form-control",placeholder="Nombre")}}
            </div>

            <div class="hueco col-xs-7">
                {{form.hidden_tag()}}
                {{form.volumen(class="form-control",placeholder="Volumen")}}
            </div>
            <div class="hueco col-xs-7">
                {{form.hidden_tag()}}
                {{form.fecha(class="form-control",placeholder="Fecha")}}
            </div>
             <div>
                {{form.hidden_tag()}}
                {{form.file(placeholder="File")}}
            </div>
            </fieldset>
            <div class="form-group">
            {{ form.submit(class="btn btn-primary") }}
        </div>
        </form>

tmp_it是大小为0到2的所有可能组合的列表。此代码非常适合较小的列表,但是我需要对较大的列表进行操作,因此希望保留 it.combinations对象的迭代器特征(动态生成组合)。例如

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

对于多种尺寸的组合,是否有这样做的方法?而不是转换为列表并失去迭代器对象的特征。

2 个答案:

答案 0 :(得分:2)

您可以chain个迭代器:

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

答案 1 :(得分:2)

您可以使用itertools.chain.from_iterable执行此操作,它会懒惰地评估其参数。像这样:

tmp_it = it.chain.from_iterable(it.combinations(list_tmp, i) for i in range(2+1)))