擅长:python、mysql、java
<p>你要找的不是排列,而是组合。置换是在不重复的情况下重新排列有限的元素集,而组合是假定<code>n</code>元素之一的<code>m</code>字段中的每一个,在python中用<code>itertools.computations_with_replacement</code>表示。在代码方面:</p>
<pre class="lang-py prettyprint-override"><code>import itertools
from functools import reduce
elements = {"A": 1, "B": 2, "C": 1}
sum_restriction = lambda x: sum(elements[i] for i in x)==4
max_els = 4 // min(elements.values()) + 1
res = reduce(lambda x,y:x+y,[list(filter(sum_restriction, itertools.combinations_with_replacement(elements.keys(), i))) for i in range(max_els+1)])
</code></pre>
<p>我的示例返回:</p>
<pre class="lang-py prettyprint-override"><code>>>> res
[('B', 'B'), ('A', 'A', 'B'), ('A', 'B', 'C'), ('B', 'C', 'C'), ('A', 'A', 'A', 'A'), ('A', 'A', 'A', 'C'), ('A', 'A', 'C', 'C'), ('A', 'C', 'C', 'C'), ('C', 'C', 'C', 'C')]
</code></pre>