如何修复错误“bool”object is not iterab

2024-10-01 15:36:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试创建这个方法,用户输入一个DNA链,然后这个方法检查用户输入的特定字符,如果它通过了,它将检查用户的输入。如果它失败,它将打印no。当我运行程序时,我有以下错误。在

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

有人能解释一下我为什么会犯这个错误吗?谢谢。在


Tags: 方法no用户in程序检查用户错误字符
3条回答

假设你希望所有输入的字符都是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字符,你需要改变循环序列的方式:

^{pr2}$

其中一种可以简化为:

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()函数是不正确的。传递给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()

这里不需要any。如果char是一个字符串,那么应该检查RHS上是否包含字符串中的任何字符。anychar in squence_str.upper()的参数计算结果为布尔值;不可编辑!在

只需使用in检查来测试是否包含:

for char in ['A','C','T','G']:
    if char in squence_str.upper():
        print "yes"
    ...

但是,要复制您想要的行为,您可以:

^{pr2}$

相关问题 更多 >

    热门问题