<p>很可能你不能把所有这些排列都记在记忆里,因为它很快就会变得非常拥挤。在</p>
<p>但是要获得案例的所有索引,可以使用<code>itertools.combinations</code>。对于1,它将给出单个指数:</p>
<pre><code>from itertools import combinations
string_ = 'january'
length = len(string_)
print(list(combinations(range(length), 1)))
# [(0,), (1,), (2,), (3,), (4,), (5,), (6,)]
</code></pre>
<p>同样,您可以得到案例2-7的索引:</p>
^{pr2}$
<p>那么只需在给定的索引处插入<code>itertools.product</code>的<code>itertools.product</code>:</p>
<pre><code>from itertools import product
import string
print(list(product(string.ascii_uppercase, repeat=1)))
# [('A',), ('B',), ('C',), ('D',), ('E',), ('F',), ('G',), ('H',), ('I',),
# ('J',), ('K',), ('L',), ('M',), ('N',), ('O',), ('P',), ('Q',), ('R',),
# ('S',), ('T',), ('U',), ('V',), ('W',), ('X',), ('Y',), ('Z',)]
</code></pre>
<p>同样地,对于不同的重复,给出了“案例”。在</p>
<p>把这些放在一起:</p>
<pre><code>def all_combinations(a_string, case):
lst = list(a_string)
length = len(lst)
for combination in combinations(range(length), case):
for inserter in product(string.ascii_uppercase, repeat=case):
return_string = lst.copy()
for idx, newchar in zip(combination, inserter):
return_string[idx] = newchar
yield ''.join(return_string)
</code></pre>
<p>然后,您可以通过以下方法获得每种情况下所需的所有排列:</p>
<pre><code>list(all_combinations('january', 2)) # case2
list(all_combinations('january', 4)) # case4
list(all_combinations('january', 7)) # case7
</code></pre>
<p>或者如果你需要所有这些:</p>
<pre><code>res = []
for case in [1, 2, 3, 4, 5, 6, 7]:
res.extend(all_combinations('january', case))
</code></pre>
<p>但这需要大量的内存。在</p>