簡體   English   中英

限制排列

[英]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 來實現這一點,因為它使用了很多 memory。

這就是more-itertools中的distinct_permutations所做的。

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)

Output:

(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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM