Возможные комбинации элементов без повторений
Задача состоит в следующем: Имеется словарь где каждому числу соответствуют буквы, на которые это число можно заменить. Нужно найти все возможные комбинации такие, что бы каждому числу соответствовала уникальная буква.
Изначально использовал функции библиотеки itertools, и неправильные варианты(где одна буква присваивается сразу нескольким числам) убирал с помощью проверки размера массива и соответственного множества(set), но время работы программы меня выходит очень большим.
Есть предположение, что нужно использовать рекурсию и тем самым перебрать все возможные варианты без повторений, но, к сожалению, в рекурсии не силён(
Пример:
data = {
1 : ["a", "b", "c"],
2 : ["b", "d", "k"],
3 : ["c", "d", "l"]
}
# code
res = [
{1: 'a', 2: 'b', 3: 'c'},
{1: 'a', 2: 'b', 3: 'd'},
{1: 'a', 2: 'b', 3: 'l'},
{1: 'a', 2: 'd', 3: 'c'},
{1: 'a', 2: 'd', 3: 'l'},
{1: 'a', 2: 'k', 3: 'c'},
{1: 'a', 2: 'k', 3: 'd'},
{1: 'a', 2: 'k', 3: 'l'},
{1: 'b', 2: 'd', 3: 'c'},
{1: 'b', 2: 'd', 3: 'l'},
{1: 'b', 2: 'k', 3: 'c'},
{1: 'b', 2: 'k', 3: 'd'},
{1: 'b', 2: 'k', 3: 'l'},
{1: 'c', 2: 'b', 3: 'd'},
{1: 'c', 2: 'b', 3: 'l'},
{1: 'c', 2: 'd', 3: 'l'},
{1: 'c', 2: 'k', 3: 'd'},
{1: 'c', 2: 'k', 3: 'l'}
]
В самой задаче количество цифр необязательно должно быть три, код выше дан как пример.
Источник: Stack Overflow на русском