在 Python/Biopython 中生成所有可能的独特肽(排列)

Generate the all possible unique peptides (permutants) in Python/Biopython

我有一个场景,其中我有一个具有 9 个 AA 的肽框架。我想通过在此框架上最多替换 3 个 AA 来生成所有可能的肽,即仅替换 1 或 2 或 3 AA。

框架是CKASGFTFS,我想通过从 20 个 AA 池中替换最多 3 个 AA 来查看所有突变体。

我们有 20 个不同的 AA(A、R、N、D、E、G、C、Q、H、I、L、K、M、F、P、S、T、W、 Y,V).

我是编码新手,所以有人可以帮助我了解如何在 Python 或 Biopython 中为此编码。

输出应该是如下所示的唯一序列列表:

CKASGFTFT, CTTSGFTFS, CTASG KTFS, CTASAFTWS, CTRSGFTFS、CKASEFTFS ....依此类推从 AA 池中获得 1、2 或 3 个替换而不更改现有框架。

好的,所以在我的代码完成后,我向后计算,

案例 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 或 2 在 case2 或 3 在 case 3.

此代码既打印它们又将它们存储到列表变量中,因此它可以是存储或内存密集型并且 CPU 密集型。

如果你想通过用数字替换字母来存储字符串,你可以减少内存占用,因为它们可能占用更少 space,你甚至可以考虑使用 pandas 之类的东西或附加到存储中的 csv 文件。

如果您愿意,可以迭代存储变量来遍历字符串,就像这样。

for i in storage:
    print(i)

或者您可以将其转换为pandas系列、数据帧或直接逐行写入存储中的csv文件。

让我们计算一下您要查找的突变总数。

假设您要更换单个 AA。首先,您的框架中有 9 个 AA,每个 AA 都可以更改为其他 19 个 AA 中的一个。那是 9 * 19 = 171

如果你想换两个AA,你的frame中有9c2 = 36种AA组合,pool中的两个有19^2个排列。这给了我们 36 * 19^2 = 12996

最后,如果要换三,池中的三有9c3 = 84种组合和19^3种排列。这给了我们 84 * 19^3 = 576156

把它们放在一起,你得到 171 + 12996 + 576156 = 589323 个可能的突变。希望这有助于说明您要完成的任务的规模!