возможны перестановки двух списков в python без объединения или слияния списков с помощью itertools в python? - PullRequest
1 голос
/ 17 июня 2020

В случае двух подсписок

`[[A,B],[1,2]]`

Я хотел бы получить результат

[[A,B],[1,2] [A,B],[2,1] [B,A],[1,2] [B,A],[2,1]]

В случае трех подсписок

`[[A,B],[1,2], [c, d]]`

Хотелось бы получить вывод

`[[A,B],[1,2], [c, d],
 [A,B],[1,2], [d, c],
 [A,B],[2,1], [c, d],
 [A,B],[2,1], [d, c],
 [B,A],[1,2], [c, d],
 [B,A],[1,2], [d, c],
 [B,A],[2,1], [c, d]
 [B,A],[2,1], [d, c]]`

1 Ответ

1 голос
/ 17 июня 2020

Использование itertools - это правильный способ сделать это (это часть стандартной библиотеки, так почему бы и нет?). Например:

from itertools import permutations, product

values = [['A', 'B'], [1, 2]]
sub_permutations = ([list(p) for p in permutations(l)] for l in values)
values_perms = [list(v) for v in product(*sub_permutations)]

Однако, конечно, можно реализовать функцию перестановки и функцию произведения :

def permutations(values):
    if not values: 
        return
    for i in range(len(values)):
        for p in all_perms(values[1:]):
            yield [*p[:i], values[0], *p[i:]]

def product(lists):
    result = [[]]
    for pool in lists:
        result = [r + [p] for r in result for p in pool]
    return result

Что мы затем можем использовать для достижения той же цели:

values = [['A', 'B'], [1, 2]]
values_perms = product(list(permutations(l)) for l in values)

Но это будет медленнее, подвержено ошибкам и означает больше кода, который нужно поддерживать. Единственное, что здесь интересно, я думаю, это реализовать его самостоятельно и посмотреть, что у вас получится, а затем просто использовать itertools.

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