在下列条件下,如何生成排列?
>有两个整数,例如. 1和4.
>给出的两个整数将是排列的一部分,其中每个整数最多出现N次,每个排列的大小为K.
因此,假设N = 3且K = 5,那么正确的结果应该是:
{1, 1, 1, 4, 4} , {1, 1, 4, 1, 4} , {4, 4, 4, 1, 1} , etc..
以下是无效或不正确结果的示例:
{1, 1, 1, 1, 4} -> 1 appear 4 times (1 should appear not greater than 3 times)
{1, 4, 4, 4, 1, 1} -> the size of the list is 6 (the size should be exactly 5)
此外,每个排列应该是唯一的,这意味着没有重复.
我希望我能为这个问题找到最好的解决方案或算法.
提前致谢. 🙂
最佳答案 看看这是否适合你
>>> 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,y)存在y的(K-i)个实例.在那种情况下,i和x都应该在[K-N,N]的范围内.
现在,下一步是使用生成器理解来创建上述集合的所有可能实例的所有可能迭代.我使用set comprehension删除任何重复项,并使用生成器不存储中间重复结果.