生成所有可能的字符组合的字符串

生成所有可能的字符组合的字符串

问题描述:

说我有一个字符串列表:生成所有可能的字符组合的字符串

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

这看起来像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它的工作方式完全相同。你可以试试它。 –

得到一个列表的所有组合(也称为笛卡儿积),最好的办法是使用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参数比使用手动扩展和解压缩列表要干净一点。