好的,所以在我的代码完成后,我倒推计算,
案例 1,为 9c1 x 19 = 171
案例 2,为 9c2 x 19 x 19 = 12,996
案例 3,为 9c3 x 19 x 19 x 19 = 576,156
总共有 589,323 种组合。
这是所有 3 种情况的代码,您可以依次运行它们。
您还要求将数组加入单个字符串,我已更新代码以反映这一点。
import copy
original = ['C','K','A','S','G','F','T','F','S']
possibilities = ['A','R','N','D','E','G','C','Q','H','I','L','K','M','F','P','S','T','W','Y','V']
storage=[]
counter=1
# case 1
for i in range(len(original)):
for x in range(20):
temp = copy.deepcopy(original)
if temp[i] == possibilities[x]:
pass
else:
temp[i] = possibilities[x]
storage.append(''.join(temp))
print(counter,''.join(temp))
counter += 1
# case 2
for i in range(len(original)):
for j in range(i+1,len(original)):
for x in range(len(possibilities)):
for y in range(len(possibilities)):
temp = copy.deepcopy(original)
if temp[i] == possibilities[x] or temp[j] == possibilities[y]:
pass
else:
temp[i] = possibilities[x]
temp[j] = possibilities[y]
storage.append(''.join(temp))
print(counter,''.join(temp))
counter += 1
# case 3
for i in range(len(original)):
for j in range(i+1,len(original)):
for k in range(j+1,len(original)):
for x in range(len(possibilities)):
for y in range(len(possibilities)):
for z in range(len(possibilities)):
temp = copy.deepcopy(original)
if temp[i] == possibilities[x] or temp[j] == possibilities[y] or temp[k] == possibilities[z]:
pass
else:
temp[i] = possibilities[x]
temp[j] = possibilities[y]
temp[k] = possibilities[z]
storage.append(''.join(temp))
print(counter,''.join(temp))
counter += 1
输出看起来像这样,(只是开始和结束)。
结果也将保存到一个名为storage 的变量中,这是一个原生 python 列表。
1 AKASGFTFS
2 RKASGFTFS
3 NKASGFTFS
4 DKASGFTFS
5 EKASGFTFS
6 GKASGFTFS
...
...
...
589318 CKASGFVVF
589319 CKASGFVVP
589320 CKASGFVVT
589321 CKASGFVVW
589322 CKASGFVVY
589323 CKASGFVVV
运行大约需要 10 - 20 分钟,具体取决于您的计算机。
它会显示所有的组合,如果任何一个与原来的相同,则跳过更改的AAs case1 或case2 中的2 或case 3 中的3。
此代码打印它们并将它们存储到列表变量中,因此它可以是存储或内存密集型和 CPU 密集型。
如果你想通过用数字替换字母来存储字符串,你可以减少内存占用,因为它们可能占用更少的空间,你甚至可以考虑使用 pandas 之类的东西或附加到存储中的 csv 文件。
如果你愿意,你可以遍历存储变量来遍历字符串,像这样。
for i in storage:
print(i)
或者您可以将其转换为 pandas 系列、数据帧或直接逐行写入存储中的 csv 文件。