Все возможные комбинации предметов в n списках - PullRequest
2 голосов
/ 14 мая 2019

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

Я уже сделал несколько простых кодов для двух списков, но проблема в том, что я не знаю, сколько вводит пользователь, поэтому я должен догадаться. На данный момент я определил функцию, которая выводит все возможные комбинации (только в одну сторону, потому что это пути). Я также тестировал другие альтернативы, такие как itertools (которые, я думаю, могут содержать ответ на мою проблему), или использовал массивы numpy (проблема в том, что мой массив не однороден).

Список ввода может выглядеть примерно так (3 измерения):

chords = [[[1, 4, 8, 12], [1, 4, 10, 12]], [[4, 7, 13, 19], [4, 9, 13, 21]]]

Моя функция, которая может генерировать перестановки между двумя списками:

def combination(list1, list2):
    list = []
    for x in list1:
        for y in list2:
            list.append([x,y])
    return list

combination(chords[0], chords[1])

Эта функция работает как задумано, но проблема, например, в том, что я ввожу combination(combination(chords[0], chords[1]), chords[3]), который не учитывается отдельно chords[0] и chords[1] (тем не менее, он работает как задумано).

Edit:

Хорошо, так как, как указал @iBug, хороший способ сделать это с помощью itertools.product ():

bases_chords = [···] #It's a three dimensional array I've filled out  before
possibilities = [] #The list that will contain all the different combinations

for a in product(*bases_chords): #The asterisk means that I input everything on the list
    possibilities.append(a)

print(possibilities)
print(len(possibilities)) #Just to check if the dimensions are right

1 Ответ

1 голос
/ 14 мая 2019

itertools.product - это то, что вы ищете. Он занимает несколько Iterable с (списки являются итеративными) и создает генератор, который перебирает все комбинации для каждой из них.

См. Пример:

>>> for a, b, c in itertools.product([1, 2, 3], "abc", [True, False]):
...  print(a, b, c)
...
1 a True
1 a False
1 b True
1 b False
1 c True
1 c False
2 a True
2 a False
2 b True
2 b False
2 c True
2 c False
3 a True
3 a False
3 b True
3 b False
3 c True
3 c False
>>>

Таким образом, ваш вариант использования превратится в:

itertools.product(*chords)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...