我需要编写一个函数,当且仅当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
答案 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