看看这是否适合你
>>> K=5
>>> N=3
>>> src=[['1']*n+['4']*(K-n) for n in xrange(K-N,N+1)]
>>> set(x for s in src for x in itertools.permutations(s))
set([('1', '4', '1', '4', '1'), ('4', '1', '4', '1', '1'), ('1', '1', '4', '4', '4'), ('1', '4', '4', '1', '1'), ('1', '4', '4', '4', '1'), ('4', '4', '4', '1', '1'), ('4', '1', '1', '4', '1'), ('4', '4', '1', '4', '1'), ('1', '4', '1', '1', '4'), ('4', '1', '4', '4', '1'), ('1', '1', '4', '4', '1'), ('1', '4', '4', '1', '4'), ('4', '1', '4', '1', '4'), ('4', '1', '1', '1', '4'), ('4', '4', '1', '1', '4'), ('1', '4', '1', '4', '4'), ('1', '1', '4', '1', '4'), ('4', '4', '1', '1', '1'), ('4', '1', '1', '4', '4'), ('1', '1', '1', '4', '4')])
注意**
首先用“1”和“4”创建所有可能的组合。请注意特定整数的最大 N 个实例的限制,因此在一组 K 数字中,如果有 i 个 x 的实例,那么对于两个数字 (x,y) 有 (K-i) 个 y 的实例。在这种情况下,i 和 x 都应该在 [K-N,N] 范围内。
现在下一步是使用生成器推导来创建上述集合的所有可能实例的所有可能迭代。我正在使用集合理解来删除任何重复项,并且还使用生成器来不存储中间重复结果。