我已经开始了生物信息学教学平台Roaslind。我想做第一个问题。这是我最终得到的代码:
#!/usr/bin/python -tt
def count_nuc():
'''Usage: count_nuc()'''
s = raw_input('Enter nucleotide string: ')
if s.isalpha():
if len(s) < 1000:
for letter in s:
if letter.upper() == 'A':
a = s.count('A')
elif letter.upper() == 'C':
c = s.count('C')
elif letter.upper() == 'G':
g = s.count('G')
elif letter.upper() == 'T':
t = s.count('T')
else:
print('Error')
print '%d %d %d %d' % (a, c, g, t)
else:
print('String must be 1000 nucleotides or less.')
count_nuc()
else:
print('String must of nucleotides must only contain alphabetic characters.')
count_nuc()
工作正常。大多。我遇到的问题有点愚蠢。我正在使用字符串的count方法来计算特定类型的核苷酸数,然后将该数字分配给我的变量。但是,如果不存在这样的核苷酸(即,我给它一个像'ATGTTT'那样的字符串,那么我的变量'c'永远不会被定义,并且打印语句barfs。我已经考虑过这个,我能想到的任何东西都不能让我得到它我已经想过要在打印之前检查变量是否存在,但这对我来说似乎有些笨拙,我不确定这是否算是正确的编码礼仪。
答案 0 :(得分:3)
您的计数算法正在做更多的工作而不是必要的。每当您在迭代时看到"A"
,您都会计算序列中的所有"A"
。相反,你可以跳过迭代,只是无条件地执行每个计数(如果你计算一些没有出现在字符串中的东西,你会得到一个0
):
if len(s) < 1000:
a = s.count('A')
c = s.count('C')
g = s.count('G')
t = s.count('T')
print '%d %d %d %d' % (a, c, g, t)
如果您想手动进行计数,则需要更改作业。将变量初始化为0
,然后在看到相关字母时将其添加到相应的变量:
if len(s) < 1000:
a = c = g = t = 0
for letter in s:
if letter.upper() == 'A':
a += 1
elif letter.upper() == 'C':
c += 1
elif letter.upper() == 'G':
g += 1
elif letter.upper() == 'T':
t += 1
else:
print('Error')
print '%d %d %d %d' % (a, c, g, t)
或者,更好的是,让Python's standard library do the counting for you:
from collections import Counter
if len(s) < 1000:
counts = Counter(s)
print "{A} {C} {G} {T}".format(counts)
答案 1 :(得分:1)
一种解决方案可能是在循环之前将所有变量分配为零。
例如:
a = c = g = t = 0
答案 2 :(得分:0)
您也可以
a = s.count('A') if letter.upper() == 'A' else 0
移动逻辑&#34;内联&#34;。