限制排列

Permutation with Limiting

我想对每个元素进行排列.. 但是,对于集合中的每个元素。我想限制重复的次数。

这里有一段代码可以理解:

_list_ = [0,1,3]

limit_dict = {
    
    0 : [0, 1],
    1 : [0, 3],
    3 : [0, 1]

}

def main(position=0, length=5, genlist=[]):

    if position == length:
        print (genlist)

    else:

        for element in _list_:

            if limit_dict[element][0] != limit_dict[element][1]:

                limit_dict[element][0] += 1

                main(position + 1, length, genlist + [element])

                limit_dict[element][0] -= 1

main()

这是总体思路,有没有更快的实现方法?

我想对大量整数执行类似的操作,因此不能使用 itertools 来实现,因为它会占用大量内存。

这就是 distinct_permutations from more-itertools 所做的。

from more_itertools import distinct_permutations

limit_dict = {
    0 : [0, 1],
    1 : [0, 3],
    3 : [0, 1]
}

elements = (k for k, v in limit_dict.items() for _ in range(*v))
for permutation in distinct_permutations(elements):
    print(permutation)

输出:

(0, 1, 1, 1, 3)
(0, 1, 1, 3, 1)
(0, 1, 3, 1, 1)
(0, 3, 1, 1, 1)
(1, 0, 1, 1, 3)
(1, 0, 1, 3, 1)
(1, 0, 3, 1, 1)
(1, 1, 0, 1, 3)
(1, 1, 0, 3, 1)
(1, 1, 1, 0, 3)
(1, 1, 1, 3, 0)
(1, 1, 3, 0, 1)
(1, 1, 3, 1, 0)
(1, 3, 0, 1, 1)
(1, 3, 1, 0, 1)
(1, 3, 1, 1, 0)
(3, 0, 1, 1, 1)
(3, 1, 0, 1, 1)
(3, 1, 1, 0, 1)
(3, 1, 1, 1, 0)