创建序列的可能修改列表

时间:2015-04-23 13:27:39

标签: list syntax-error bioinformatics

我对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      

1 个答案:

答案 0 :(得分:2)

事实上,您的代码存在一些问题,但第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']