2017-08-31 148 views
3

說我有一個字符串列表:生成所有可能的字符組合的字符串

li = ['a', 'b', 'c'] 

我想建立一個新的列表,使得新的列表中的每個條目是選擇3的串聯原始列表中的條目。請注意,每個條目可以反覆選擇:

new_li=['abc', 'acb', 'bac', 'bca', 'cab', 'cba', 'aab', 'aac',....'aaa', 'bbb', 'ccc'] 

殘酷的力的方法是構造一個3倍嵌套for循環和每個3組合插入到新列表。我想知道是否有Pythonic方法來處理這個問題?謝謝。

更新: 後來我將新的列表轉換爲一個集合,所以順序無關緊要。

+0

是否必須是隨機的?名單應該多久? –

+0

@ whackamadoodle3000請參閱更新。列表的長度應爲3^n,其中n是原始列表中的條目數 – James

回答

3

這看起來像itertools.product的工作。

import itertools 

def foo(l): 
    yield from itertools.product(*([l] * 3)) 

for x in foo('abc'): 
    print(''.join(x)) 

aaa 
aab 
aac 
aba 
abb 
abc 
aca 
acb 
acc 
baa 
bab 
bac 
bba 
bbb 
bbc 
bca 
bcb 
bcc 
caa 
cab 
cac 
cba 
cbb 
cbc 
cca 
ccb 
ccc 

yield from是python3.3及以後提供給您。對於一個循環內舊版本,yield

def foo(l): 
    for i in itertools.product(*([l] * 3)) : 
     yield i 
+0

謝謝。如果原始列表中的每個條目不是單個字符,如li = ['a1','b2','c3']? – James

+1

@James它的工作方式完全相同。你可以試試它。 –

1

得到一個列表的所有組合(也稱爲笛卡兒積),最好的辦法是使用itertools.product使用迭代的lenrepeat參數(這就是它的不同從對方的回答):

from itertools import product 
li = ['a', 'b', 'c'] 
for comb in product(li, repeat=len(li)): 
    print(''.join(comb)) 

,或者如果你想要的結果如表:

>>> combs = [''.join(comb) for comb in product(li, repeat=len(li))] 
>>> combs 
['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa', 
'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab', 
'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc'] 

使用repeat參數比使用手動擴展和解壓縮列表要乾淨一點。

相關問題