指数超出范围

时间:2016-03-02 20:19:49

标签: python python-2.7

我需要帮助一件事,我的程序有时会工作,有时候不行。它不适用于那些氨基酸序列,

时:

a = 'MEATPGYQDISALEKSVTYISLCFKVANAGSQLYTMAHKLHAVERSLEQTTMEQMDEMEVLELLESMSEVTNEYQNLRKDIREVQQLQRDVSSSIRYQMRSMQQTFHTLKQRIASSQKGRKKPEKGLDGAGVGIHE'
b = 'MRRGFAQSSKWLARNAKANLPTAVGAGIVPAPVKMGRSQYGRLLSLTKSEKWVLTAGIGCLVVSSAITMSVPLFLGKVIDVVFNKSGMDSAAMAKLGEYSVLLFGIFVLGGFANFARVHLFGNAALRIVRSLRSRLYRSMLMQEVGWFDTKGTGELINRLSNDTLMVGTSLSQNVSDGLRSVAMIGVGTGMMIYTSPQLAAVSALVVPAMAGMAIVYGRYVRRITKVELDKYAEIMKFAEERFGNVKTVKTFCREQQEVAAFDGKLDEALQIGYKETRARAIFFGLVRPKGKVLRKIIKICYPLFQTGFCGNFIIISVLYYGGTLVLQDSLTIGALTAFMLYAGYVAISMNGLSNFYSQLNKGIGASERIWEILDRECSIPIDKGVVPLEKPVGEVGFQNVFFTFPTRPESAVLTDFSLNLMPGTTTAVVGRSGSGKTTIALLMLRLYDPQGGTVHLDGIDLRTVNPQWLRNNIGAVSQEPVLFSCSIRENILYGANPGETPSPERLQQVIEDANVSQFTDQLPDGLDTLVGQRGMMLSGGQKQRVAIARALIKNPAILILDEATSALDAVSENLVQNALDNLIQGRTVLTIAHRLSTIRNADQIAVLSDGKIVEQGSYNELMGIQEGVFRELVASQAFGSRN'
a1 = len(a)
b1 = len(b)

我的程序看起来像

即:

porownanie = True
for i in range(a1):
    for j in range(b1):
        if a[i]==b[j]:
            x1.append(i)
            y1.append(j)
            r=0
            while a[i+r]==b[j+r] and porownanie == True:
                dlugoscir.append(r+1)
                if r==3:
                    i1.append(a[i],a[i+1],a[i+2],a[i+r])
                    j1.append(b[j],b[j+1],b[j+2],b[j+r])
                elif r>3:
                    i1.append(a[i+r])
                    j1.append(b[j+r])
                r=r+1
                porownanie = len(a[0:i+r+1])<a1 and len(b[0:j+r+1])<b1

我有命令问题,而不是所有时间,但有了这个序列,它显示字符串索引超出范围,我不知道为什么。当命令中的任何内容为假时,它应该停止。

感谢您提前

2 个答案:

答案 0 :(得分:1)

您需要测试r不会导致使用的索引太大。

您可以将测试部分作为时间

while i+r < a1 and  j+r < b1 and a[i+r] == b[j+r]:

正如我们在代码中看到的那样。

for i in range(a1):
  for j in range(b1):
    if a[i]==b[j]:
        x1.append(i)
        y1.append(j)
        r=0
        while i+r < a1 and  j+r < b1 and a[i+r] == b[j+r]:
            dlugoscir.append(r+1)
            if r==3:
                i1.append(a[i],a[i+1],a[i+2],a[i+r])
                j1.append(b[j],b[j+1],b[j+2],b[j+r])
            elif r>3:
                i1.append(a[i+r])
                j1.append(b[j+r])
            r += 1

答案 1 :(得分:0)

首先,请不要写porownanie == Trueporownanie本身就是一个布尔值,因此只有porownanie就足够了

问题是while a[i+r]==b[j+r] and porownanie == True:。 Python从左到右评估表达式,所以当porownanieFalse时,它应该退出循环,但它在a[i+r]==b[j+r]出错之前就会出错!

修复很简单:只需切换订单

即可

while porownanie and a[i+r]==b[j+r]:

顺便说一下,这是一个更简单的porownanie = len(a[0:i+r+1])<a1 and len(b[0:j+r+1])<b1版本,效率更高:

porownanie = i+r+1 < a1 and j+r+1 < b1

因为它不需要从切片构造新列表。只是一个简单的算术计算。

你也可以完全删除porownanie并将表达式移动到while循环的条件:

while i+r+1 < a1 and j+r+1 < b1 and a[i+r]==b[j+r]:
    ...
相关问题