Как бы я превратил этот массив букв с выбором в список возможных слов?

#python

Вопрос:

 7h47 --> should be 'that' in 1337speak
[['j', 't'], ['h'], ['a', 'h'], ['j', 't']]
 

Таким образом , результатом должно быть: possible_words = [jhaj, jhat, jhhj, jhht, thaj, that, thhj, thht] , просто возникли проблемы с переходом к этому шагу.

Ответ №1:

То, что вам нужно, — это комбинация этих списков.

К счастью, Python делает всю тяжелую работу за вас, и все, что вам нужно, — это использовать itertools.product :

 import itertools

letters = [['j', 't'], ['h'], ['a', 'h'], ['j', 't']]
words = [''.join(x) for x in itertools.product(*letters)]
 

И вы получаете:

 ['jhaj', 'jhat', 'jhhj', 'jhht', 'thaj', 'that', 'thhj', 'thht']
 

Более подробно itertools.product возвращает итератор, который генерирует все возможные комбинации параметров (список букв). Затем мы перебираем эти комбинации в рамках понимания списка и используем join , чтобы получить слово из каждого списка «символов» ( str длиной 1 в Python).

Комментарии:

1. Спасибо! Это очень полезно 🙂

Ответ №2:

Если вы поклонник рекурсии, вот подход с использованием генераторов:

 def combine(combinations, prefix=''):
    head, *tail = combinations

    # If it's the last word from the combinations
    if not tail:
        # Yield the full word using the head as suffixes
        for letter in head:
            yield prefix   letter
    else:
        # Yield from the tail combinations using the head as suffixes
        for letter in head:
            yield from combine(tail, prefix   letter)    

print(list(combine([['j', 't'], ['h'], ['a', 'h'], ['j', 't']])))
# ['jhaj', 'jhat', 'jhhj', 'jhht', 'thaj', 'that', 'thhj', 'thht']