说我有一个字符串列表:
li = ['a', 'b', 'c']
我想构建一个新列表,使新列表的每个条目都是原始列表中3个条目的选择的串联。请注意,可以重复选择每个条目:
new_li=['abc', 'acb', 'bac', 'bca', 'cab', 'cba', 'aab', 'aac',....'aaa', 'bbb', 'ccc']
残酷的力量方法是构建一个3倍嵌套for循环并将每个3组合插入新列表中。我想知道是否有任何Pythonic方法来处理它?感谢。
更新: 稍后我会将新列表转换为一个集合,因此无论如何顺序无关紧要。
答案 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
参数比使用手动添加和解压缩列表更清晰。