如何从表示环肽的字符串生成子肽(特殊组合)?

时间:2013-11-01 00:17:36

标签: python string substring combinations itertools

这是我的问题:我有一个代表 cyclic 肽的序列,我正在尝试创建一个生成所有可能的子肽的函数。当2个氨基酸之间的键断裂时,产生亚肽。例如:对于肽'ABCD',其子肽将是'A','B','C','D','AB','BC','CD','DA','ABC', 'BCD','CDA',DAB'。因此,来自长度为n的肽的可能的亚肽的量将总是n *(n-1)。请注意,并非所有这些都是来自肽的子串('DA','CDA'......)。

我编写了一个生成组合的代码。但是,有一些过量的元素,例如没有连接的氨基酸('AC','BD'......)。有没有人有一个暗示我怎么能消除这些,因为每次调用该函数时肽可能有不同的长度?这是我到目前为止所做的:

def Subpeptides(peptide): 
    subpeptides = []
    from itertools import combinations
    for n in range(1, len(peptide)):
        subpeptides.extend(
    [''.join(comb) for comb in combinations(peptide, n)]
    )
    return subpeptides

以下是肽'ABCD'的结果:

['A', 'B', 'C', 'D', 'AB', 'AC', 'AD', 'BC', 'BD', 'CD', 'ABC', 'ABD', 'ACD', 'BCD']

如果它们代表肽的真实序列,则氨基酸的顺序并不重要。例如,'ABD'是'DAB'的有效形式,因为D和A在环肽中具有键。

我正在使用Python。

3 个答案:

答案 0 :(得分:6)

将它们全部生成可能更容易:

def subpeptides(peptide):
    l = len(peptide)
    looped = peptide + peptide
    for start in range(0, l):
        for length in range(1, l):
            print(looped[start:start+length])

给出:

>>> subpeptides("ABCD")
A
AB
ABC
B
BC
BCD
C
CD
CDA
D
DA
DAB

(如果您想要一个列表而不是打印,只需将print(...)更改为yield ...并且您有一个生成器。

所有上述内容都列举了第一个债券可以被破坏的不同位置,然后是在一个,两个或三个(在这种情况下)酸之后下一个债券破裂时会得到的不同产品。 looped只是一种简单的方法,可以避免出现“围绕循环”的逻辑。

答案 1 :(得分:0)

上个学期错过了 你可以使用下面的代码

def subpeptides(peptide):
    l = len(peptide)
    ls=[]
    looped = peptide + peptide
    for start in range(0, l):
        for length in range(1, l):
            ls.append( (looped[start:start+length]))
    ls.append(peptide)
    return ls

答案 2 :(得分:0)

你可以使用这个

>>>aa='ABCD'
>>> F=[]
>>> B=[]
>>> for j in range(1,len(aa)+1,1):
for i in range(0,len(aa),1):
    A=str.split(((aa*j)[i:i+j]))
    B=B+A
    C=(B[0:len(aa)*len(aa)-len(aa)+1])

它给你:

C = ['A','B','C','D','AB','BC','CD','DA','ABC','BCD','CDA', 'DAB','ABCD']

我希望这会有所帮助,顺便说一下,如果有兴趣加入力量的话,我也会做这个课程,让我知道