Если вы действительно имеете в виду комбинации (без повторов, порядок не имеет значения):
import itertools
S = [ 'a', 'ab', 'ba' ]
for i in range(len(S)+1):
for c in itertools.combinations(S, i):
cc = ''.join(c)
if len(cc) <= 6:
print c
испускает все возможности:
()
('a',)
('ab',)
('ba',)
('a', 'ab')
('a', 'ba')
('ab', 'ba')
('a', 'ab', 'ba')
Если вы имеете в виду нечто иное, чем «комбинации», это просто вопрос использования правильного итератора или генератора в for
(например, itertools.permutations
, или что-то еще вашего собственного изобретения).
Редактировать : если, например, вы имеете в виду «повторы и порядок важны»,
def reps(seq, n):
return itertools.product(*[seq]*n)
for i in range(7):
for c in reps(S, i):
cc = ''.join(c)
if len(cc) <= 6:
print c
даст вам необходимые 85 строк вывода.
Снова отредактируйте : у меня был неправильный предел цикла (и, следовательно, неправильная длина вывода) - tx комментатору, который указал на это. Кроме того, этот подход может создать строку> 1 раз, если '.join из разных кортежей считается эквивалентным; например, он производит ('a', 'ba') в отличие от ('ab', 'a'), хотя их.'join одинаковы (я полагаю, одно и то же слово из разных так называемых "комбинаций") - используемая терминология не совсем понятна).