列表中所有可能的字母组合,从1到20 - python

时间:2018-06-11 08:51:41

标签: python combinations combinatorics itertools

目前正试图让它在列表中创建这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]

2 个答案:

答案 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