Все возможные комбинации букв из списка, от 1 до 20 - питон - PullRequest
0 голосов
/ 11 июня 2018

В настоящее время пытаюсь получить это, чтобы создать все возможные комбинации этих 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 голосов
/ 11 июня 2018

Вот один из способов:

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 - все возможные комбинации.

PS bin(i) обычно быстрее, чем выполнение битовых манипуляций,но я не уверен, что все еще действует с добавленным zfill.

0 голосов
/ 11 июня 2018

Вы можете использовать вложенный цикл в понимании списка, чтобы перебрать все возможные длины:

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)]
...