I have a list of 5 letters [‘A’, ‘B’, ‘N’, ‘M’,’E’].
I want to print all the words (word means a sequence of letters, it doesn’t have to be a valid English word) of length 10 letters that have exactly two letters A. Order is important.
I have tried with itertools.product as it appeared to be the most promising solution:
from itertools import product letters = ['A', 'B', 'N', 'M','E'] for word in product(letters, repeat=10): res = ''.join(str(x) for x in word) print(res)
The problem with this approach is that I can’t really control the number of occurrences of the letter A as it returns the word composed of 10 letters of A.
Is there a solution for this? Thanks
EDIT 1 Example of possible words: BANAMEMNEB : it has only twice the letter A, we don’t care about other letters.
Advertisement
Answer
The way to do it efficiently is to iterate over all combinations of the positions of the letters ‘A’, and for each such combination – iterate over all the ways other letters can be positioned, and just insert the ‘A’s there.
Be warned that with your inputs this will produce almost 3 million words!
On my machine it was printing the words for so long that I had to manually stop execution.
So here is the smaller example:
letters = ['A', 'b', 'c'] num_As = 2 num_total = 4 from itertools import combinations, product for indices_A in combinations(range(num_total), num_As): for rest in product(letters[1:], repeat=num_total - num_As): rest = list(rest) for index_A in indices_A: rest.insert(index_A, 'A') print(''.join(rest))
AAbb AAbc AAcb AAcc AbAb AbAc AcAb AcAc AbbA AbcA AcbA AccA bAAb bAAc cAAb cAAc bAbA bAcA cAbA cAcA bbAA bcAA cbAA ccAA