1

编写一个 Python 脚本,要求用户输入两个长度相同的 DNA 序列。如果两个序列的长度不同,则输出“无效输入,长度必须相同!” 如果输入有效,则计算这两个序列中有多少相同位置的 dna 碱基相等,并输出答案“这两个序列的 x 位置具有相同的字符”。x 是实际数字,取决于用户的输入。

以下是我到目前为止所拥有的。

g=input('Enter DNA Sequence: ')
h=input('Enter Second DNA Sequence: ')

i=0
count=0

if len(g)!=len(h):
        print('Invalid')
else:
    while i<=len(g):
        if g[i]==h[i]:
            count+=1
        i+=1
print(count)
4

5 回答 5

5

请在您的 while 循环中执行此操作(在您的实际代码中选择更好的变量名称):

for i, j in zip(g, h):
    if i == j:
        count += 1

或将循环完全替换为

count = sum(1 for i, j in zip(g, h) if i == j)

这将修复您的索引错误。一般来说,您不应该在 python 中索引列表,而是循环它们。如果您真的想为它们编制索引,那i <= len(g)是问题所在……应该将其更改为i < len(g).


True == 1如果你想变得非常棘手,你可以使用and的事实False == 0

count = sum(int(i == j) for i, j in zip(g, h))
于 2013-10-08T01:25:11.780 回答
1

这里的问题是你的循环条件。你的代码给你一个IndexError; 这意味着您尝试访问字符串的字符,但该索引处没有字符。这里的意思i是大于len(g) - 1

考虑这段代码:

while i<=len(g):
    print(i)
    i+=1

对于g = "abc",它打印

0
1
2
3

那是四个数字,不是三个!由于您从 开始0,因此您必须省略最后一个数字,3。您可以这样调整您的条件:

while i < len(g):
    # do things

但是在 Python 中,当使用-loop时,您应该避免使用while循环。for在这里,您可以使用 for 循环遍历一个序列,zip并将两个序列合并为一个。

for i, j in zip(g, h):
    # i is the character of g, and j is the character of h
    if i != j:
        count += 1

您会注意到您避免了索引错误的可能性,并且不必键入这么多[i]的 s。

于 2013-10-08T01:34:00.400 回答
0
g = raw_input('Enter DNA Sequence: ')
h = raw_input('Enter Second DNA Sequence: ')
c = 0
count = 0

if len(g) != len(h):
    print('Invalid')
else:
    for i in g:
        if g[c] != h[c]:
            print "string does not match at : " + str(c)
            count = count + 1
        c = c + 1

print(count)
于 2013-10-08T06:36:44.837 回答
0

i<=len(g)- 将其替换为i<len(g),因为索引计数从 0 开始,而不是 1。这是您面临的错误。但此外,你的代码不是很漂亮......

第一种简化它的方法,保持你的结构:

for i in range(len(g)):
    if g[i]==h[i]:
            count+=1

更好的是,您实际上可以将其设为单线:

sum(g[i]==h[i] for i in range(len(g)))

True这里使用了在 Python 中计算为 1的事实。

于 2013-10-08T01:27:56.273 回答
-3
if(len(g)==len(h)):
   print sum([1 for a,b in zip(g,h) if a==b])

编辑:修复了未闭合的括号。感谢您的评论,一定会查看生成器解决方案并学习一点 - 谢谢!

于 2013-10-08T01:26:39.627 回答