如何修复对象不可迭代'bool'错误



我正在尝试创建此方法,其中用户输入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'

或者,如果您只想要TrueFalse,并且(请将字符串传递到功能而不是使用全局变量...):

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()

相关内容

最新更新