Форум сайта python.su
0
Здравствуйте. Нужна помощь в написании одной функции.
На вход ей подаётся list, в котором лежат строки.
Функция генерирует все перестановки всех длин.
Пример: на вход ‘AB’, ‘CD’, ‘XY’, ‘MN’
Выдает (очередь не важна)
AB
CD
XY
MN
ABAB
ABCD
ABXY
ABMN
CDAB
CDCD
CDXY
CDMN
…
MNAB
MNCD
MNXY
MNMN
ABCDXY
ABXYCD
CDXYAB
CDABXY
XYABCD
XYCDAB
… и т.д.
Как это написать это, подскажите, пожалуйста.
Использоваться она потом будет в программе, где нужно найти все палиндромы из слов текста, который на вход получен.
Отредактировано kanz (Апрель 16, 2013 16:06:36)
Офлайн
43
from itertools import product def permutate(lst,n): return '\n'.join(['\n'.join(''.join(e) for e in product(lst,repeat=k)) for k in range(n+1)]) print(permutate(['AB','CD','XY','MN'],2)) AB CD XY MN ABAB ABCD ABXY ABMN CDAB CDCD CDXY CDMN XYAB XYCD XYXY XYMN MNAB MNCD MNXY MNMN
Офлайн
0
Спасибо, но нет.
Я написал — нужно составить все.
Это значит, что вариантов у нас просто уйма.
К примеру, на входе было ab, cd, xy, mn, ok, tu (слова текста)
Функция должна генерировать вообще всё, что можно.
Скажем, даже такие варианты: xyoktu, tuabmn, okcdmn, abtuxy, okxytucd, xytuabmn, tucdokab и т.д.
Т.е. перебирать все возможные сочетания, и всех возможных длин.
Отредактировано kanz (Апрель 17, 2013 12:46:01)
Офлайн
47
from itertools import product def permutate(lst): l = len(lst) for i in range(1,l+1): for tup in product(lst,repeat=i): yield ''.join(tup) print(* permutate(['AB','CD','XY','MN','OK','TU']), sep='\n')
Офлайн
857
>>> import itertools >>> >>> lst = ['AB','CD','XY','MN'] >>> n = 3 >>> >>> combs = itertools.chain(*(itertools.permutations(lst, i) ... for i in range(1, n + 1))) >>> print(*map(''.join, combs), sep='\n') AB CD XY MN ABCD ABXY ABMN CDAB CDXY CDMN XYAB XYCD XYMN MNAB MNCD MNXY ABCDXY ABCDMN ABXYCD ABXYMN ABMNCD ABMNXY CDABXY CDABMN CDXYAB CDXYMN CDMNAB CDMNXY XYABCD XYABMN XYCDAB XYCDMN XYMNAB XYMNCD MNABCD MNABXY MNCDAB MNCDXY MNXYAB MNXYCD >>>
Офлайн