我需要帮助一件事,我的程序有时会工作,有时候不行。它不适用于那些氨基酸序列,
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
我有命令问题,而不是所有时间,但有了这个序列,它显示字符串索引超出范围,我不知道为什么。当命令中的任何内容为假时,它应该停止。
感谢您提前
答案 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 == True
。 porownanie
本身就是一个布尔值,因此只有porownanie
就足够了
问题是while a[i+r]==b[j+r] and porownanie == True:
。 Python从左到右评估表达式,所以当porownanie
为False
时,它应该退出循环,但它在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]:
...