生成所有可能的字符组合的字符串
说我有一个字符串列表:生成所有可能的字符组合的字符串
li = ['a', 'b', 'c']
我想建立一个新的列表,使得新的列表中的每个条目是选择3的串联原始列表中的条目。请注意,每个条目可以反复选择:
new_li=['abc', 'acb', 'bac', 'bca', 'cab', 'cba', 'aab', 'aac',....'aaa', 'bbb', 'ccc']
残酷的力的方法是构造一个3倍嵌套for循环和每个3组合插入到新列表。我想知道是否有Pythonic方法来处理这个问题?谢谢。
更新: 后来我将新的列表转换为一个集合,所以顺序无关紧要。
这看起来像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
谢谢。如果原始列表中的每个条目不是单个字符,如li = ['a1','b2','c3']? – James
@James它的工作方式完全相同。你可以试试它。 –
得到一个列表的所有组合(也称为笛卡儿积),最好的办法是使用itertools.product
使用迭代的len
为repeat
参数(这就是它的不同从对方的回答):
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
参数比使用手动扩展和解压缩列表要干净一点。
是否必须是随机的?名单应该多久? –
@ whackamadoodle3000请参阅更新。列表的长度应为3^n,其中n是原始列表中的条目数 – James