Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查字符串是否包含列表以外的字符串_Python_Python 3.x_String - Fatal编程技术网

Python 检查字符串是否包含列表以外的字符串

Python 检查字符串是否包含列表以外的字符串,python,python-3.x,string,Python,Python 3.x,String,我有一个字符串,如下所示: f = 'ATCTGTCGTYCACGT' 我想检查字符串是否包含除A、C、G或T以外的任何字符,如果是,请打印它们 for i in f: if i != 'A' and i != 'C' and i != 'G' an

我有一个字符串,如下所示:

f = 'ATCTGTCGTYCACGT'
我想检查字符串是否包含除A、C、G或T以外的任何字符,如果是,请打印它们

for i in f:                                                                                                                        
    if i != 'A' and i != 'C' and i != 'G' and i != 'T':                                                                             
        print(i)
有没有一种方法可以在不循环字符串的情况下实现这一点?

就这样做吧

l = ['A', 'C', 'G', 'T']

for i in f:
    if i not in l:
        print(i)
它检查列表是否包含列表的字符

如果不想循环浏览列表,可以执行以下操作:

import re

l = ['A', 'C', 'G', 'T']

contains = bool(re.search("%s" % "[" + "".join(l) + "]", f))

根据输入字符串的大小,for循环可能是最有效的解决方案

但是,由于您显式地请求一个没有显式循环的解决方案,因此可以使用正则表达式来完成

import re

f = 'ABCDEFG'

print(*re.findall('[^ABC]', f), sep='\n')
输出

D
E
F
G
您可以使用set实现所需的输出

f = 'ATCTGTCGTYCACGTXYZ'
not_valid={'A', 'C', 'G' , 'T'}
unique=set(f)
print(unique-not_valid)
输出

{'Y','X','Z'} #characters in f which are not equal to 'A','C','G','T'

从技术上讲,这会循环,但我们会将输入字符串转换为一个集合,以删除重复的值

accepted_values = ['a','t','c','g']

input = 'ATCTGTCGTYCACGT'

print([i for i in set(input.lower()) if i not in accepted_values])

要检查字符是否不在字符串中,还是要打印除某些字符以外的所有字符?这是两个不同的任务。我想知道f字符串中除了“A”、“C”、“G”或“T”之外是否还有其他字符。如果是的话,我想打印出来。你不想循环的主要原因是时间/效率吗?集合似乎是优化查找的好地方,但要以字符串转换为集合为代价,这可能会造成很大的处理开销。这回答了您的问题吗?你的意思是不使用for循环或任何循环构造。例如,在幕后,函数式编程方法可以是任意的、映射的,可以说regex也可以。为清楚起见,您希望避免使用任何循环构造的函数,还是避免使用基本的循环函数,例如For、while等?如果将前者设置为后者,我可能会采用正则表达式匹配方法。有没有一种方法可以在不循环字符串的情况下实现这一点?这段代码和OP做的完全一样,只是以一种更简洁的方式,这不是问题的前提。我对其进行了编辑,使其现在符合要求。如果OP不关心顺序或重复,则其正确性应为f='ABCA';无效={'A'}打印A或AA?@DeepSpace抱歉,我不明白您的查询应该是f='ABCA';无效={'A'}打印A或AA?如果你不介意的话,你能再解释一遍吗?如果有重复的缺失字符,你的解决方案将只打印其中一个,而且由于集合无序,因此也会出现顺序混乱。我并不是说这不好,只是OP没有具体说明他们做了什么want@DeepSpace我的第一个方法是使用正则表达式,但在OP提到的一个注释中,我想知道f字符串中是否有除“A”、“C”、“G”或“T”以外的字符,我认为set是一种选择。我也考虑过,但我不知道这是否算作循环