Функция, включающая весь список комбинаций - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь создать функцию, которая содержит все элементы комбинации списка. Детали таковы.

Это когда элементы списка [1,2,3] и n = 4. Например,

elements=[1,2,3]
all_data=[]

for x_1 in elements:
    tmp=[]
    tmp.append(x_1)
    all_data.append(tmp)
    for x_2 in elements:
        tmp=[]
        tmp.append(x_1)
        tmp.append(x_2)
        all_data.append(tmp)
        for x_3 in elements:
            tmp=[]
            tmp.append(x_1)
            tmp.append(x_2)
            tmp.append(x_3)
            all_data.append(tmp)
            for x_4 in elements:
                tmp=[]
                tmp.append(x_1)
                tmp.append(x_2)
                tmp.append(x_3)
                tmp.append(x_4)
                all_data.append(tmp)
all_data

Вывод: *

[[1],
 [1, 1],
 [1, 1, 1],
 [1, 1, 1, 1],
 [1, 1, 1, 2],
 [1, 1, 1, 3],
 [1, 1, 2],
 [1, 1, 2, 1],
 [1, 1, 2, 2],
 [1, 1, 2, 3],
 [1, 1, 3],
 [1, 1, 3, 1],
 [1, 1, 3, 2],
 [1, 1, 3, 3],
 [1, 2],
 [1, 2, 1],
 [1, 2, 1, 1],
 [1, 2, 1, 2],
 [1, 2, 1, 3],
 [1, 2, 2],
 [1, 2, 2, 1],
 [1, 2, 2, 2],
 [1, 2, 2, 3],
 [1, 2, 3],
 [1, 2, 3, 1],
 [1, 2, 3, 2],
 [1, 2, 3, 3],
 [1, 3],
 [1, 3, 1],
 [1, 3, 1, 1],
 [1, 3, 1, 2],
 [1, 3, 1, 3],
 [1, 3, 2],
 [1, 3, 2, 1],
 [1, 3, 2, 2],
 [1, 3, 2, 3],
 [1, 3, 3],
 [1, 3, 3, 1],
 [1, 3, 3, 2],
 [1, 3, 3, 3],
 [2],
 [2, 1],
 .....
 [3, 2, 3],
 [3, 2, 3, 1],
 [3, 2, 3, 2],
 [3, 2, 3, 3],
 [3, 3],
 [3, 3, 1],
 [3, 3, 1, 1],
 [3, 3, 1, 2],
 [3, 3, 1, 3],
 [3, 3, 2],
 [3, 3, 2, 1],
 [3, 3, 2, 2],
 [3, 3, 2, 3],
 [3, 3, 3],
 [3, 3, 3, 1],
 [3, 3, 3, 2],
 [3, 3, 3, 3]]

Но я хочу добиться того, чтобы функция выполнялась n раз с использованием (вероятно) выражения l oop. Итак, вывод функции, который я хочу сделать, должен выглядеть примерно так:

[[1],
[1,1],
......
[1,1,1,1,......,1], #(1 of n times)
[1,1,1,1,......,2],
......
[6],
[6,6],
......
[6,6,6,6,......,6]] #(n times)

Хотя я потратил почти целую неделю, чтобы заняться этим вопросом, пока не достиг ни одного решения. Может кто-нибудь дать мне несколько советов или случайно узнать какие-нибудь идеи? Любая подсказка очень приветствуется.

Спасибо.

1 Ответ

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

Похоже, что вы хотите получить декартово произведение k элементов в списке для k в [1, 4].
Если это так, вы можете использовать itertools.product и вычислите произведение для k=1,2,3,4

>>> res = list(itertools.chain.from_iterable(itertools.product([1,2,3], repeat=k) for k in range(1,5)))
>>> res
[(1,), (2,), (3,), (1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 1), (1, 3, 2), (1, 3, 3), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 1), (2, 3, 2), (2, 3, 3), (3, 1, 1), (3, 1, 2), (3, 1, 3), (3, 2, 1), (3, 2, 2), (3, 2, 3), (3, 3, 1), (3, 3, 2), (3, 3, 3), (1, 1, 1, 1), (1, 1, 1, 2), (1, 1, 1, 3), (1, 1, 2, 1), (1, 1, 2, 2), (1, 1, 2, 3), (1, 1, 3, 1), (1, 1, 3, 2), (1, 1, 3, 3), (1, 2, 1, 1), (1, 2, 1, 2), (1, 2, 1, 3), (1, 2, 2, 1), (1, 2, 2, 2), (1, 2, 2, 3), (1, 2, 3, 1), (1, 2, 3, 2), (1, 2, 3, 3), (1, 3, 1, 1), (1, 3, 1, 2), (1, 3, 1, 3), (1, 3, 2, 1), (1, 3, 2, 2), (1, 3, 2, 3), (1, 3, 3, 1), (1, 3, 3, 2), (1, 3, 3, 3), (2, 1, 1, 1), (2, 1, 1, 2), (2, 1, 1, 3), (2, 1, 2, 1), (2, 1, 2, 2), (2, 1, 2, 3), (2, 1, 3, 1), (2, 1, 3, 2), (2, 1, 3, 3), (2, 2, 1, 1), (2, 2, 1, 2), (2, 2, 1, 3), (2, 2, 2, 1), (2, 2, 2, 2), (2, 2, 2, 3), (2, 2, 3, 1), (2, 2, 3, 2), (2, 2, 3, 3), (2, 3, 1, 1), (2, 3, 1, 2), (2, 3, 1, 3), (2, 3, 2, 1), (2, 3, 2, 2), (2, 3, 2, 3), (2, 3, 3, 1), (2, 3, 3, 2), (2, 3, 3, 3), (3, 1, 1, 1), (3, 1, 1, 2), (3, 1, 1, 3), (3, 1, 2, 1), (3, 1, 2, 2), (3, 1, 2, 3), (3, 1, 3, 1), (3, 1, 3, 2), (3, 1, 3, 3), (3, 2, 1, 1), (3, 2, 1, 2), (3, 2, 1, 3), (3, 2, 2, 1), (3, 2, 2, 2), (3, 2, 2, 3), (3, 2, 3, 1), (3, 2, 3, 2), (3, 2, 3, 3), (3, 3, 1, 1), (3, 3, 1, 2), (3, 3, 1, 3), (3, 3, 2, 1), (3, 3, 2, 2), (3, 3, 2, 3), (3, 3, 3, 1), (3, 3, 3, 2), (3, 3, 3, 3)]
>>> len(res)
120

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

for k in range(1,4):
   for t in itertools.product([1,2,3], repeat=k):
      ... 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...