У меня есть список возможных слов, чтобы сделать анаграмму данных слов. Каждая строка списка является ключом к словарю и имеет значение одного или нескольких слов. Какой лучший (самый быстрый, пифонический) способ сделать все возможные предложения в порядке ключей от слов в каждом списке соответствующих клавиш в словаре. Списки имеют в них переменное количество ключей.
keylist = ['key1', 'key2', 'key3']
worddict = {'key1': ['a','b','c'], 'key2':['d','e','f'], 'key3':['g','h','i']}
Ожидаемый результат (первое слово из списка первых ключей, второе из списка вторых ключей и т.д.):
["a d g",
"a d h",
"a d i",
.....
"c f i"]
Поощряя обезьяну с продуктами, я мог их сгибать, чтобы адаптировать переменное количество ключей из словаря таких списков:
import itertools
keylist = ['key1', 'key4','key2']
worddict = {'key1': ['a','b','c'],
'key2':['d','e','f'],
'key3':['g','h','i'],
'key4':['j','k','l']}
sentences = (' '.join(sentence)
for sentence in itertools.product(*(worddict[k]
for k in keylist)))
print '\n'.join(sentences)
Используйте функцию product
в модуле itertools для создания всех комбинаций ваших итераций
import itertools
for sentence in itertools.product(['a','b','c'], ['d','e','f'], ['g','h','i']):
print sentence
Вывод будет кортежей, но при необходимости их можно легко преобразовать в строки или списки.
Что-то вроде этой работы?
import itertools
anagrams = []
for x in itertools.product(*worddict.values()):
anagrams.extend(" ".join(y) for y in itertools.permutations(x))