Как создать комбинации нескольких списков без повторений?

Рейтинг: 0Ответов: 1Опубликовано: 17.01.2023

Подскажите, пожалуйста, как в python создать комбинации слов из нескольких списков но не комбинировать собственные слова каждого списка. Пока придумал только с помощью itertools, но много лишних комбинаций.

import itertools

form = ['A', 'B', 'C']
style = ['D', 'E', 'F']
material = ['G', 'H', 'I']
color = ['J', 'K', 'L']
special = ['M', 'N', 'O']

results = itertools.combinations(form + style + material + color + special, 5)
for item in results:
    print(''.join(item))

Т.е. после вывода должно получиться что-то такое:

A D G J M 
A E G J M
A F G J M 

и т.д., но не должно получиться:

A B C D E
A B C D F
A B C D G

и т.д.

Каким-то образом этот код стал резать вывод:

def f(*iterables):
    if len(iterables) == 1:
        yield from iterables[0]
        return
    for letter in iterables[0]:
        for n in f(*iterables[1:]):
            yield letter + "+" + n


form = ['pryamaya', 'uglovaya', 'p-obraznaya', 's-ostrovom', 's-barnoj-stojkoj', 'do-potolka']
style = ['klassicheskaya', 'sovremennaya', 'neoklassika', 'loft', 'provans', 'kantri', 'haj-tek', 'modern',
         'minimalizm', 'skandinavskij-stil']
material = ['massiv-dereva', 'mdf', 'mdf-emal', 'shpon', 'akril', 'plastik', 'glyanecz', 'matovyj', 's-patinoj']
color = ['svetlaya', 'temnaya', 'belaya', 'golubaya', 'zelenaya', 'krasnaya', 'seraya', 'chernaya', 'cherno-belaya']
special = ['fasad-bez-ruchek', 'ramochnyj-fasad', 'fasad-s-frezerovkoj', 'radiusnyj-fasad']
for x in f(form, style, material, color, special):
    print(x)

Ответы

▲ 1Принят

Можно сделать так:

def f(*iterables):
    if len(iterables)==1:
        yield from iterables[0]
        return
    for letter in iterables[0]:
        for n in f(*iterables[1:]):
            yield letter+n

form = ['A', 'B', 'C']
style = ['D', 'E', 'F']
material = ['G', 'H', 'I']
color = ['J', 'K', 'L']
special = ['M', 'N', 'O']

for x in f(form, style, material, color, special):
    print(x)

Вывод:

ADGJN
ADGJO
ADGKM
ADGKN
ADGKO
...
CFIJO
CFIKM
CFIKN
CFIKO
CFILM
CFILN
CFILO