在Python/Biopython中生成所有可能的唯一肽(置换)

问题描述

我有一个场景,其中我有一个具有9个氨基酸的肽框。我想通过替换此框架上最多3个氨基酸(即仅替换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、CTASGKTF、CTASAFTWS,CTRSGFTFS、CKASEFTFS.依此类推,在不更改现有框架的情况下从AA池中获得1、2或3个替换项。


解决方案

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

案例1,为9C1 x 19=171

案例2,为9c2 x 19 x 19=12,996

案例3,为9C3 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分钟。

它将显示所有组合,如果有任何一个与案例1中的原始AA或案例2中的2或案例3中的3相同,则跳过更改AA。

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

如果要通过用数字替换字母来存储字符串,可以减少内存占用,因为它们可能占用较少的空间。您甚至可以考虑使用 pandas 之类的内容或将其追加到存储中的CSV文件中。

如果愿意,您可以迭代存储变量以遍历字符串,如下所示。

for i in storage:
    print(i)

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

相关文章