创建序列可能修改的列表

creating a list of possible modifications of a sequence

我对 Python 不是很有经验,我的脚本出现以下错误:

"invalid syntax in line 4"

我不明白原因,也许有人可以提供帮助。

我正在尝试创建一个序列所有可能修改的列表(如 SEQWKST)。如果字母是 "S",则修改为 "phos"。如果字母是 "K" 则有三种可能的修改:"dimeth" "meth""ac"

我想创建一个包含可能的修改及其位置的列表

(eg:
1,phos
4,ac
4,meth
4,meth...)

#!/bin/python

def createPTM (SEQWKST):
    PTMlist = []
    pos = 0
    for N in SEQWKST:
        pos += 1
        if N == "Y":
            PTM = phos
            PTM_list.extend(pos,PTM)
        elif N=="S":
            PTM = phos
            PTMlist.extend(pos,PTM) 
        elif N=="T":
            PTM = phos
            PTMlist.extend(pos,PTM)     
        elif N=="R":
            PTM = meth
            PTM_2 = dimeth
            PTMlist.extend(pos,PTM)
            PTMlist.extend(pos,PTM_2)
        elif N=="K":
            PTM = meth
            PTM_2 = dimeth
            PTM_3 = ac
            PTMlist.extend(pos,PTM)
            PTMlist.extend(pos,PTM_2)
            PTMlist.extend(pos,PTM_3)       
    return PTM_list
    print PTM_list      

事实上,您的代码存在多个问题,但第 4 行的 SyntaxError 似乎不是其中之一。

请注意,extend 采用单个参数(某种序列)并使用该序列扩展给定列表,因此您需要调用它,例如PTM_list.extend((pos,PTM))

您没有定义 phosmeth 等,但我猜这些应该是字符串对象?

print PTM_list 在您的函数定义之外,它不再在范围内。我猜你想打印 create_PTM

的返回值

尝试:

#!/bin/python

def createPTM (SEQWKST):
    PTM_list = []
    pos = 0
    for N in SEQWKST:
        pos += 1
        if N == "Y":
            PTM = 'phos'
            PTM_list.extend((pos,PTM))
        elif N=="S":
            PTM = 'phos'
            PTM_list.extend((pos,PTM))
        elif N=="T":
            PTM = 'phos'
            PTM_list.extend((pos,PTM))
        elif N=="R":
            PTM = 'meth'
            PTM_2 = 'dimeth'
            PTM_list.extend((pos,PTM))
            PTM_list.extend((pos,PTM_2))
        elif N=="K":
            PTM = 'meth'
            PTM_2 = 'dimeth'
            PTM_3 = 'ac'
            PTM_list.extend((pos,PTM))
            PTM_list.extend((pos,PTM_2))
            PTM_list.extend((pos,PTM_3))
    return PTM_list

print createPTM('YSRKT')

一种更 Pythonic 的方法是使用字典而不是 if..elif 并定义一个函数来执行您的专业列表扩展:

#!/bin/python

def createPTM (SEQWKST):
    PTM_list = []

    def extend_PTM_list(pos, PTMs):
        for PTM in PTMs:
            PTM_list.extend((pos, PTM))

    d = {'Y': ['phos'],
         'S': ['phos'],
         'T': ['phos'],
         'R': ['meth', 'dimeth'],
         'K': ['meth', 'dimeth', 'ac']
        }


    for pos, N in enumerate(SEQWKST, start=1):
        extend_PTM_list(pos, d[N])

    return PTM_list

print createPTM('YSRKT')

输出(例如):

[1, 'phos', 2, 'phos', 3, 'meth', 3, 'dimeth', 4, 'meth', 4, 'dimeth', 4, 'ac', 5, 'phos']