目前正试图让它在列表中创建这20个字母的所有可能组合,(不重复)
letters = ['G','A','L','M','F','W','K','Q','E','S','P','V','I','C','Y','H','R','N','D','T']
combinations = [''.join(i) for i in itertools.combinations(letters,r=20)]
输出我正在寻找的列表如下:
combinations = ['G','A','L','M','F','W','K','Q','E','S','P','V','I','C','Y','H','R','N','D','T',GG,GA,GL,GM... ...GALMFWKQESPVICYHRNDT]
答案 0 :(得分:2)
您可以在列表推导中使用嵌套循环来迭代所有可能的长度:
letters = ['G','A','L','M','F','W','K','Q','E','S','P','V','I','C','Y','H','R','N','D','T']
combinations = [''.join(i) for j in range(1,len(letters) + 1) for i in itertools.combinations(letters,r=j)]
答案 1 :(得分:1)
这是一种方式:
letters = ['G','A','L','M','F','W','K','Q','E','S','P','V','I','C','Y','H','R','N','D','T']
def gen_combinations(opts):
for index in range(2 ** len(opts)):
mask = bin(index)[2:].zfill(len(opts))
selected = [o for (o,m) in zip(opts, mask) if m == '1']
yield ''.join(selected)
如果您只想要一些可能性:
for (i,x) in enumerate(gen_combinations(letters)):
print(x)
if i > 10: break
输出:
# The empty set T D DT N NT ND NDT R RT RD RDT
如果你想要全部:
all_combinations = list(gen_combinations(letters))
print(len(all_combinations)) # 1048576
这使用一个生成器来查看(在这种情况下)20位数的二进制表示,如果该位为1,则将该项添加到该迭代的输出列表中。
将会有2 ^ len(opts)列表元素 - 在这种情况下为2 ^ 20 - 所有可能的组合。
P.S。 bin(i)
通常比进行位操作更快,但我不确定是否仍然使用添加的zfill
。