如何用布尔类型检查for循环中的所有字符?

时间:2016-06-20 21:54:08

标签: python if-statement for-loop boolean-operations

我需要编写一个函数,当且仅当DNA序列不包含“A”,“T”,“C”和“G”以外的字符时才返回True。

以下是产生此类错误的代码 - “str”对象不支持项目分配

def is_valid_sequence(dna):
    i = 0
    for dna[i] in dna:
        if dna[i] in 'ATCG':
            i = i +1
            return True
        else:
            return False

我为同一目的创建了另一个代码,但它只检查序列中的第一个字符,我不知道如何让循环检查以下字符

def is_valid_sequence(dna):
    i = 0
    for char in dna:
        if char in 'ATCG':
            i = i +1
            return True
        else:
            return False

3 个答案:

答案 0 :(得分:1)

这个问题有一个非常简单的pythonic解决方案:

def is_valid_sequence(dna):
    return all(c in 'ATCG' for c in dna.upper())

这将检查每个字母,而不关心输入的情况。

all()采用可迭代的方式,如果每个元素都是真的,则只返回True。由于c in 'ATCG'返回一个布尔值,这是一个非常干净的解决方案。

答案 1 :(得分:0)

您提供的代码在循环中存在一些缺陷,通常循环将在字符上运行,迭代发生在您在for循环中设置的变量,第二个代码段中i的增量不是在你的代码中使用。只有dna[i]而不是for i in dna才能做到。

在你的情况下,我会建议集合中的东西 -

让我们说dna是带有上限字母的字符串

permitted_characters = "ATCG"
set(dna).issubset(set(permitted_characters))

根据您的要求,这将返回True和False set会将字符串分解为非重复的字母集。

答案 2 :(得分:-3)

def func(dna):
    for i in dna:
        if i not in 'ATCG':
            return False
    return True