我正在尝试创建此方法,其中用户输入DNA链,然后该方法检查用户的输入,如果特定字符传递,则它会打印是yes,如果失败了。当我运行程序时,我有以下错误。
TypeError: 'bool' object is not iterable
squence_str = raw_input("Enter either A DNA, Protein or RNA sequence:")
def DnaCheck():
for char in ['A','C','T','G']:
if any(char in squence_str.upper()):
print "yes"
else:
print "no"
print "DNA ", DnaCheck()
任何人都可以解释为什么我有这个错误,谢谢。
您在这里不需要any
。如果char
是字符串,您想检查字符串中字符中的任何是否包含在RHS上。any
的参数,char in squence_str.upper()
评估布尔值;不可能!
只需使用in
检查测试即可:
for char in ['A','C','T','G']:
if char in squence_str.upper():
print "yes"
...
但是,要复制您所需的行为,您可以做:
def DnaCheck():
squence_str = set(squence_str.upper()) # use set for efficient membership check
for char in ['A','C','T','G']:
if char not in squence_str:
return False
return True
假设您希望所有字符输入是DNA序列字符,我认为您希望您更接近这一点:
def DnaCheck():
if all(c in squence_str for c in ['A','C','T','G']):
return "yes"
else:
return "no"
print "DNA ", DnaCheck()
假设您确实正在寻找任何字符是DNA字符,则需要更改序列上循环的方式:
def DnaCheck():
# this return true if squence_str is 'ABCDEFG' for example...
if any(c in squence_str for c in ['A','C','T','G']):
return "yes"
else:
return "no"
可以简化:
def DnaCheck():
return 'yes' if all(c in squence_str for c in 'ACTG') else 'no'
或者,如果您只想要True
或False
,并且(请将字符串传递到功能而不是使用全局变量...):
def DnaCheck(squence_str):
return all(c in squence_str for c in 'ACTG')
或更快地,利用set
压缩任何 'ACTG'
等于或子集的序列:
def DnaCheck(squence_str):
return set(squence_str)<=set('ACTG') # equivalent but faster than all
(大写squence_str
以简短删除。使用用户输入,您需要将squence_str.upper()
添加到上面的功能...)
您对Any()函数的使用不正确。传递给任何()的参数必须是某种列表。如果列表/集合中的任何元素为true,该函数将返回true。因此,错误的原因是您将布尔值传递到Any()函数而不是布尔值列表中。
解决核心问题,您的方法是两个的混合。一方面,您是在列表的字符上迭代,表明您想在每次迭代中进行一次比较。另一方面,您正在与Any()函数一次进行所有比较。
我认为这更多是您正在寻找的
squence_str = raw_input("Enter either A DNA, Protein or RN:")
def DnaCheck():
for character in ['A','C','T','G']:
if character in (squence_str.upper()):
print "yes"
break
else:
print "no"
print "DNA "
DnaCheck()