Вы создаете перестановку мультимножества.
Простой, но наивный подход заключается в использовании itertools.permutations()
с набором чтобы отфильтровать повторяющиеся комбинации:
>>> from itertools import permutations
>>> seen = set()
>>> for combo in permutations([1] * 4 + [0] * 4):
... if combo not in seen:
... seen.add(combo)
... print combo
...
(1, 1, 1, 1, 0, 0, 0, 0)
(1, 1, 1, 0, 1, 0, 0, 0)
(1, 1, 1, 0, 0, 1, 0, 0)
(1, 1, 1, 0, 0, 0, 1, 0)
(1, 1, 1, 0, 0, 0, 0, 1)
(1, 1, 0, 1, 1, 0, 0, 0)
# ...
(0, 0, 1, 0, 1, 0, 1, 1)
(0, 0, 1, 0, 0, 1, 1, 1)
(0, 0, 0, 1, 1, 1, 1, 0)
(0, 0, 0, 1, 1, 1, 0, 1)
(0, 0, 0, 1, 1, 0, 1, 1)
(0, 0, 0, 1, 0, 1, 1, 1)
(0, 0, 0, 0, 1, 1, 1, 1)
или, производя всю последовательность за один раз:
set(permutations([1] * 4 + [0] * 4))
но это теряет порядок, который произвел permutations
.
Набор необходим, так как permutations()
видит 4 1
и 4 0
как отдельные символы, а один 1
, переставленный другим, считается уникальной перестановкой.
Вы также можете использовать порядок в последовательности, чтобы избежать использования набора:
last = (1,) * 8
for combo in permutations([1] * 4 + [0] * 4):
if combo < last:
last = combo
print combo
Подход наивен в том, что 2n! перестановки производятся там, где нам нужны только (2n выбирают n) элементы. Для вашего случая это 40320 перестановок, где нам нужно произвести только 70.
person
Martijn Pieters
schedule
07.07.2014