Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 16, 2013 16:06:06

kanz
Зарегистрирован: 2013-04-16
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Все перестановки всех длин.

Здравствуйте. Нужна помощь в написании одной функции.
На вход ей подаётся 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)

Офлайн

#2 Апрель 16, 2013 17:41:58

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Все перестановки всех длин.

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

Офлайн

#3 Апрель 17, 2013 12:44:50

kanz
Зарегистрирован: 2013-04-16
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Все перестановки всех длин.

Спасибо, но нет.
Я написал — нужно составить все.
Это значит, что вариантов у нас просто уйма.
К примеру, на входе было ab, cd, xy, mn, ok, tu (слова текста)
Функция должна генерировать вообще всё, что можно.
Скажем, даже такие варианты: xyoktu, tuabmn, okcdmn, abtuxy, okxytucd, xytuabmn, tucdokab и т.д.
Т.е. перебирать все возможные сочетания, и всех возможных длин.

Отредактировано kanz (Апрель 17, 2013 12:46:01)

Офлайн

#4 Апрель 17, 2013 15:20:41

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

Все перестановки всех длин.

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')

Офлайн

#5 Апрель 19, 2013 08:48:09

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Все перестановки всех длин.

>>> 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
>>>



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version