3 回答
TA贡献1821条经验 获得超6个赞
试试这个而不是你的for循环:
for choices in itertools.product(['AA','AS','AD',None],['BB', 'BC', None],[' '.join(k) for j in list(itertools.combinations(['CD','CF'],i) for i in range(3)) for k in j]):
# do what you need
使用选项的输出print(' '.join(column for column in choices if column))是:
AA BB
AA BB CD
AA BB CF
AA BB CD CF
AA BC
AA BC CD
AA BC CF
AA BC CD CF
AA
AA CD
AA CF
AA CD CF
AS BB
AS BB CD
AS BB CF
AS BB CD CF
AS BC
AS BC CD
AS BC CF
AS BC CD CF
AS
AS CD
AS CF
AS CD CF
AD BB
AD BB CD
AD BB CF
AD BB CD CF
AD BC
AD BC CD
AD BC CF
AD BC CD CF
AD
AD CD
AD CF
AD CD CF
BB
BB CD
BB CF
BB CD CF
BC
BC CD
BC CF
BC CD CF
CD
CF
CD CF
我建议你更换None用''或删除它们。
TA贡献1847条经验 获得超7个赞
当然要表达
all_others=[CD,CF,CG] #All, 1, 2 or none of these
把它分解为
all_others=[CD] #one or none of these
all_others=[CF] #one or none of these
all_others=[CG] #one or none of these
然后你的代码变成
from itertools import product
for choices in product(['AA','AS','AD',None],['BB', 'BC', None], ['CD', None], ['CF', None], ['CG', None],):
print(' '.join(column for column in choices if column))
这处理这个特殊的例子。但是,如果您有多个以 C 开头的项目,则可以按如下方式更系统地处理它们:
from itertools import product
for choices in product(['AA','AS','AD',None],['BB', 'BC', None], *product(['CD', 'CF', 'CG'], [None]),):
print(' '.join(column for column in choices if column))
为了解释发生了什么,取['CD', 'CF', 'CG']with的乘积会[None]产生一个迭代器,其中包含
('CD', None), ('CF', None), ('CG', None)
这些正是我们希望传递给product 的*参数。运算符将迭代器内的元素转换为函数参数。因此上面的两个代码片段是等价的。
TA贡献1862条经验 获得超7个赞
这是做你想要的那种事情的更强大/更通用的方法。我首先定义一个辅助函数:
from itertools import combinations, chain, product
def subsets_of_length(s, lengths):
return chain.from_iterable(combinations(s,l) for l in lengths)
它产生以下输出:
>>>> list(subsets_of_length(['a','b','c'], range(2,4)))
[('a', 'b'), ('a', 'c'), ('b', 'c'), ('a', 'b', 'c')]
>>>> list(subsets_of_length(['d','e'], range(0,2)))
[(), ('d',), ('e',)]
现在我们要组合两个或多个子集如下
>>>> for choices in product(
subsets_of_length(['a','b','c'], range(2,4)),
subsets_of_length(['d','e'], range(0,2)),
):
print(' '.join(str(subset) for subset in choices))
('a', 'b') ()
('a', 'b') ('d',)
('a', 'b') ('e',)
('a', 'c') ()
('a', 'c') ('d',)
('a', 'c') ('e',)
('b', 'c') ()
('b', 'c') ('d',)
('b', 'c') ('e',)
('a', 'b', 'c') ()
('a', 'b', 'c') ('d',)
('a', 'b', 'c') ('e',)
但是我们想将这些元组链接在一起。因此我们应该这样做
>>>> for choices in map(chain.from_iterable,product(
subsets_of_length(['a','b','c'], range(2,4)),
subsets_of_length(['d','e'], range(0,2)),
)):
print(' '.join(column for column in choices if column))
a b
a b d
a b e
a c
a c d
a c e
b c
b c d
b c e
a b c
a b c d
a b c e
您编辑的问题案例的代码是:
for choices in map(chain.from_iterable,product(
subsets_of_length(['AA','AS','AD'], [1]), #only one of these
subsets_of_length(['BB','BC'], [1,2]), #at least one of these
subsets_of_length(['CD','CF','CG'], [0,1,2,3]), #All, 1, 2 or none of these
)):
print(' '.join(column for column in choices if column))
添加回答
举报