限制排列
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)
我想对每个元素进行排列.. 但是,对于集合中的每个元素。我想限制重复的次数。
这里有一段代码可以理解:
_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)