Jam*_*mes 3 python string combinations python-itertools
说我有一个字符串列表:
li = ['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)
我想构造一个新列表,以使新列表的每个条目都是原始列表中3个条目的选择的串联。请注意,可以重复选择每个条目:
new_li=['abc', 'acb', 'bac', 'bca', 'cab', 'cba', 'aab', 'aac',....'aaa', 'bbb', 'ccc']
Run Code Online (Sandbox Code Playgroud)
残酷的方法是构造一个3折嵌套的for循环,并将每个3组合插入到新列表中。我想知道是否有任何Python方式可以解决这个问题?谢谢。
更新:稍后我将把新列表转换成一个列表,因此顺序无论如何都没有关系。
得到一个列表的所有组合(也称为笛卡尔乘积)最好的方法是使用itertools.product使用len你的迭代器作为repeat参数(即它从对方的回答不同的):
from itertools import product
li = ['a', 'b', 'c']
for comb in product(li, repeat=len(li)):
print(''.join(comb))
Run Code Online (Sandbox Code Playgroud)
或者如果你想要结果作为列表:
>>> 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']
Run Code Online (Sandbox Code Playgroud)
使用repeat参数比手动乘以和解包列表要干净一些。
这看起来像是工作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
Run Code Online (Sandbox Code Playgroud)
yield from在python3.3及更高版本中可用。对于较旧的版本,请yield循环执行:
def foo(l):
for i in itertools.product(*([l] * 3)) :
yield i
Run Code Online (Sandbox Code Playgroud)