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))
添加回答
舉報