<p>对于<code>['X','Y','Z']</code>,可以创建9对。但是对<code>XX, YY, ZZ, YZ, ZY</code>是禁止的。所以它仍然是<code>XY,XZ,YX,ZX</code>。把它分成两个单位(<code>units1</code>和<code>units2</code>),以避免<code>XX</code>的排列。如果<code>length</code>是偶数,它只需使用itertools乘积对每个单元进行排列(请参见:<a href="https://stackoverflow.com/questions/3099987/generating-permutations-with-repetitions-in-python">generating permutations with repetitions in python</a>)。它将生成可以连接到字符串的元组列表(请参见:<a href="https://stackoverflow.com/questions/1815316/why-cant-i-join-this-tuple-in-python/1815319">Why can't I join this tuple in Python?</a>)。把那两张单子加在后面。你知道吗</p>
<p>对于奇数情况,单元1的组合将产生任何带有<code>X</code>前缀的组合,因此在每个字符串的最后一个字符串后面加上“X”,在开始处加上<code>Y,Z</code>。对于单位2的组合做相反的。它不会产生唯一的列表,所以转换到<code>set</code>只是为了使它唯一</p>
<pre><code>import itertools
def combine(length):
units1 = ['XY','XZ']
units2 = ['YX','ZX']
combine1 = ["".join(map(str,p)) for p in itertools.product(units1,repeat=int(length/2))]
combine2 = ["".join(map(str,p)) for p in itertools.product(units2,repeat=int(length/2))]
if (length%2 == 1):
combine1_odd = [item + 'X' for item in combine1] + ['Y' + item for item in combine1] + ['Z' + item for item in combine1]
combine2_odd = ['X' + item for item in combine2] + [item + 'Y' for item in combine2] + [item + 'Z' for item in combine2]
return list(set(combine1_odd + combine2_odd))
return list(set(combine1 + combine2))
print(combine(5))
</code></pre>