我需要一种算法,它可以对重复的组合进行排名/取消。我需要的是n个数字选择k个数字,最多重复r个。
例如对于n(范围)= 4的列表,k(len_combination)= 3,r(max_repeats)= 2
(1, 1, 2)
(1, 1, 3)
(1, 1, 4)
(1, 2, 2)
(1, 2, 3)
(1, 2, 4)
(1, 3, 3)
(1, 3, 4)
(1, 4, 4)
(2, 2, 3)
(2, 2, 4)
(2, 3, 3)
(2, 3, 4)
(2, 4, 4)
(3, 3, 4)
(3, 4, 4)
我希望输出作为与(1,1,2)排名最低this link组合的排名为我提供了一个重复排列的算法,this wiki page给了我一个方法计算组合排名没有重复,我的要求是组合排名与 有限重复
我知道itertools.product,计算我的序列在完整列表中的位置不是一个选项,因为我正在处理n> 100我需要的是这样的函数。我正在寻找一种基于组合计算的解决方案。
def rank_seq(S,n,k,r):
##some kickass math calculations
return rank
print(rank_seq(2,2,4),4,3,2)) ##output 11
print(rank_seq(2,2,4),5,3,2)) ##output 16
print(rank_seq(2,2,4),6,3,2)) ##output 22
答案 0 :(得分:0)
尝试使用itertools.product
:
import itertools
l = itertools.product(list(range(1,4)),repeat=3)
c = 1
for i in l:
if not len(set(i)) == 1:
print('Rank: {} :{}'.format(c,i))
c+=1
else:
pass
输出:
Rank: 1 :(1, 1, 2)
Rank: 2 :(1, 1, 3)
Rank: 3 :(1, 2, 1)
Rank: 4 :(1, 2, 2)
Rank: 5 :(1, 2, 3)
Rank: 6 :(1, 3, 1)
Rank: 7 :(1, 3, 2)
Rank: 8 :(1, 3, 3)
Rank: 9 :(2, 1, 1)
Rank: 10 :(2, 1, 2)
Rank: 11 :(2, 1, 3)
Rank: 12 :(2, 2, 1)
Rank: 13 :(2, 2, 3)
Rank: 14 :(2, 3, 1)
Rank: 15 :(2, 3, 2)
Rank: 16 :(2, 3, 3)
Rank: 17 :(3, 1, 1)
Rank: 18 :(3, 1, 2)
Rank: 19 :(3, 1, 3)
Rank: 20 :(3, 2, 1)
Rank: 21 :(3, 2, 2)
Rank: 22 :(3, 2, 3)
Rank: 23 :(3, 3, 1)
Rank: 24 :(3, 3, 2)