for i, item in enumerate(sequence):
    if item != pivot:
        yield item
else:
    pivot_indexes.add(i)
seq_len = i + 1

def fill_pivots(permutation):
    for pivot_positions in combinations(list(range(seq_len)), len(pivot_indexes)):
        sequence = iter(permutation)
yield tuple(pivot if i in pivot_positions else next(sequence) for i in
    range(seq_len))
for permutation in permutations(yield_non_pivots()):
    for filled_permutation in fill_pivots(permutation):
        yield filled_permutation
Как генерировать перестановки списка без «перемещения» нулей. в Питоне