Вложено для петель python - PullRequest
       27

Вложено для петель python

1 голос
/ 09 февраля 2020

Есть ли способ, подобный функции c анадроми, иметь число циклов c в динамике? Буквы - это массив символов ['a','b','c','d'], а letterdict - это словарь {'a':['b','c'],'b':['a'],'c':['d'],'d':['b','c','d'] Мой код такой для n = 13:

for x in letters:
    for k1 in letterdict[x]:
        for k2 in letterdict[k1]:
            for k3 in letterdict[k2]:
                for k4 in letterdict[k3]:
                    for k5 in letterdict[k4]:
                        for k6 in letterdict[k5]:
                            for k7 in letterdict[k6]:
                                for k8 in letterdict[k7]:
                                    for k9 in letterdict[k8]:
                                        for k10 in letterdict[k9]:
                                            for k11 in letterdict[k10]:
                                                for k12 in letterdict[k11]:
                                                    for k13 in letterdict[k12]:
                                                        word=""
                                                        word=x+k1+k2+k3+k4+k5+k6+k7+k8+k9+k10+k11+k12+k13
                                                        print(word)

, но я хочу такой же код для n циклов, как этот:

для n = 3

for x in letters:
    for k1 in letterdict[x]:
        for k2 in letterdict[k1]:
            for k3 in letterdict[k2]:
                word=""
                word=x+k1+k2+k3
                print(word)

1 Ответ

2 голосов
/ 09 февраля 2020

Как правило, когда вам нужно бесконечно много вложенных циклов, вы должны вместо этого написать рекурсивную функцию. Вот реализация в качестве функции генератора:

def generate_strings(letters, transitions, k):
    def helper(s):
        if len(s) == k:
            yield s
        elif len(s) < k:
            for letter in transitions[s[-1]]:
                yield from helper(s + letter)
    for letter in letters:
        yield from helper(letter)

Пример: обратите внимание, что вам не нужно использовать список символов, поскольку строка также является последовательностью символов.

>>> letters = 'abcd'
>>> transitions = {'a': 'bc', 'b': 'a', 'c': 'd', 'd': 'bcd'}
>>> for s in generate_strings(letters, transitions, 4):
...     print(s)
... 
abab
abac
acdb
acdc
acdd
baba
bacd
cdba
cdcd
cddb
cddc
cddd
dbab
dbac
dcdb
dcdc
dcdd
ddba
ddcd
dddb
dddc
dddd
...