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

时间:2017-08-31 21:38:39

标签: python string combinations itertools

说我有一个字符串列表:

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

我想构建一个新列表,使新列表的每个条目都是原始列表中3个条目的选择的串联。请注意,可以重复选择每个条目:

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

残酷的力量方法是构建一个3倍嵌套for循环并将每个3组合插入新列表中。我想知道是否有任何Pythonic方法来处理它?感谢。

更新: 稍后我会将新列表转换为一个集合,因此无论如何顺序无关紧要。

2 个答案:

答案 0 :(得分: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
从python3.3及更高版本可以使用

yield from。对于旧版本,循环中的yield

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

答案 1 :(得分:1)

获取列表的所有组合(也称为笛卡尔积)的最佳方法是使用len使用您的iterable的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

使用How can I make enumerate start at element 1参数比使用手动添加和解压缩列表更清晰。