我正在尝试创建分支和绑定算法,为此,我想创建一个迭代器对象,该对象存储大小为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)], [])
对于多种尺寸的组合,是否有这样做的方法?而不是转换为列表并失去迭代器对象的特征。
答案 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)))