Это то, что я придумал, чтобы вычислить все подмножества длины 0, 1, ..., n из набора длины n с удвоением отдельных элементов.Трудно описать ...
def subsets(seq, *args):
seqstart = [[seq[i] for i in args], ]
if len(args) == 0:
for i in range(len(seq)):
seqstart += subsets(seq, i)
elif len(args) < len(seq):
for i in range(args[-1], len(seq)):
seqstart += subsets(seq, *args + (i, ))
return seqstart
Примеры:
>>> subsets(['x', 'y'])
[[], ['x'], ['x', 'x'], ['x', 'y'], ['y'], ['y', 'y']]
>>> subsets(['x', 'y', 'z'])
[[], ['x'], ['x', 'x'], ['x', 'x', 'x'], ['x', 'x', 'y'], ['x', 'x', 'z'], ['x', 'y'], ['x', 'y', 'y'], ['x', 'y', 'z'], ['x', 'z'], ['x', 'z', 'z'], ['y'], ['y', 'y'], ['y', 'y', 'y'], ['y', 'y', 'z'], ['y', 'z'], ['y', 'z', 'z'], ['z'], ['z', 'z'], ['z', 'z', 'z']]
Какая длина подмножеств (последовательности) зависит от длины последовательности?(Я убил процесс через 50 часов с n = 14)
Спасибо
Майкл
edit: Спасибо всем.Таким образом, это биномиальный коэффициент 2n над n.
Чтобы получить все подмножества вместо мультимножеств (итого общей длиной 2 ^ n), мне нужно было заменить
for i in range(args[-1], len(seq)):
на
for i in range(args[-1] + 1, len(seq)):