给定一组项目,例如:
[ 1, 2, 3, 4, 5, 6 ]
我想通过重复生成一定长度的所有可能组合。扭曲是我想从预先确定的组合开始(组合列表中的一种偏移量)。
例如,从这个开始:
[ 1, 5, 6 ]
第一个(下一个)组合是:
[ 1, 6, 6 ]
我已经成功itertools.combinations_with_replacement()
地用来生成组合,但是这个项目需要使用一个生成太多组合的集合——首先创建它们并迭代到正确的点是不可能的。
我发现这个示例用于生成第 k 个组合,这对我来说似乎效果不佳。这个答案似乎是另一种可能性,但我似乎无法将它从 C 移植到 Python。
到目前为止,这是我使用第k 个组合示例的代码:
import operator as op
items = [ 1,2,3,4,5,6 ]
# https://stackoverflow.com/a/4941932/1167783
def nCr(n, r):
r = min(r, n-r)
if r == 0:
return 1
numer = reduce(op.mul, xrange(n, n-r, -1))
denom = reduce(op.mul, xrange(1, r+1))
return numer // denom
# https://stackoverflow.com/a/1776884/1167783
def kthCombination(k, l, r):
if r == 0:
return []
elif len(l) == r:
return l
else:
i = nCr(len(l)-1, r-1)
if k < i:
return l[0:1] + kthCombination(k, l[1:], r-1)
else:
return kthCombination(k-i, l[1:], r)
# get 1st combination of 3 values from list 'items'
print kthCombination(1, items, 3)
# returns [ 1, 2, 4 ]
任何帮助都会很棒!