Как определить функцию, которая создает циклы for, встроенные друг в друга с помощью python? - PullRequest
0 голосов
/ 16 июня 2020

Я программирую, используя python3. Я искал программу, которая могла бы генерировать каждую комбинацию из 16 аккордов (для музыки c сочинения), выбирая между аккордом C или аккордом G. Мне удалось использовать этот код:

chords = ['C', 'G']
progressions = []

 for chord1 in chords:
     for chord2 in chords:
         for chord3 in chords:
             for chord4 in chords:
                 for chord5 in chords:
                     for chord6 in chords:
                         for chord7 in chords:
                             for chord8 in chords:
                                 for chord9 in chords:
                                     for chord10 in chords:
                                         for chord11 in chords:
                                             for chord12 in chords:
                                                 for chord13 in chords:
                                                     for chord14 in chords:
                                                         for chord15 in chords:
                                                                  for chord16 in chords:

                                                                       progressions.append([chord1, chord2, chord3, chord4,
                                                                                 chord5, chord6, chord7, chord8,
                                                                                 chord9, chord10, chord11, chord12,
                                                                                 chord13, chord14, chord15, chord16]
                                                                                )
 print(progressions)
 print(f'{len(progressions)} progressions generated.')

Вот что я получаю в качестве вывода (это именно тот результат, который мне нужен): [... ['G', 'G', 'G' , 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'C', 'G', 'G'. , 'G'], ['G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G' , 'G', 'G', 'C', 'C', 'C'], ['G', 'G', 'G', 'G', 'G', ' G ',' G ',' G ',' G ',' G ',' G ',' G ',' G ',' C ',' C ',' G '], [' » G »,« G »,« G »,« G »,« G »,« G »,« G »,« G »,« G »,« G »,« G »,« G »,« G » , 'C', 'G', 'C'], ['G', 'G', 'G', 'G', 'G', 'G', 'G', 'G'. , 'G', 'G', 'G', 'G', 'G', 'C', 'G', 'G'], ['G', 'G', 'G', ' G ',' G ',' G ',' G ',' G ',' G ',' G ',' G ',' G ',' G ',' G ',' C ',' ' C '], [' G ',' G ',' G ',' G ',' G ',' G ',' G ',' G ',' G ',' G ',' G '. , 'G', 'G', 'G', 'C', 'G'], ['G', 'G', 'G', 'G', 'G', 'G', ' G ',' G ',' G ',' G ',' G ',' G ',' G ',' G ',' G ',' C '], [' G ',' G '». , 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', ' G ',' G ']] Сгенерировано 65536 прогрессий.

Очевидно, что этот код не является коротко и мило, насколько это могло быть. Вот почему я хотел бы определить функцию, которая генерирует циклы. Чтобы сделать его еще лучше, я подумал, что было бы лучше добавить в качестве параметра для функции число l oop, которое она должна создать, чтобы он выбирался каждый раз при выполнении программы.

Заранее спасибо

Lu c

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Что вам нужно, так это декартово произведение вашего chords набора / списка с самим собой 16 раз. Для этого у вас есть itertools.product() в Python.

Например, чтобы добиться того же эффекта, что и ваш код, вы должны сделать что-то вроде этого:

import itertools

chords = ['C', 'G']
progressions = list(itertools.product(chords, repeat=16))

print(progressions)
print(f'{len(progressions)} progressions generated.')
0 голосов
/ 16 июня 2020

Вы можете использовать функцию перестановок из модуля itertools, чтобы выполнить sh this.

Например,

import itertools

chords = ['A', 'B']
depth = 16

progressions = itertools.permutations(chords * depth)

print(f'{len(list(progressions))} progressions generated.')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...