在python中过滤字符串中的字符。(如果字符在string2中,请从string1中筛选它们)
我对这段代码一直有语法问题。我在if语句行中得到一个语法错误。这段代码的目的是过滤掉字符串2中的字符,并在没有这些字符的情况下重新打印字符串1。我认为我写出来的逻辑是正确的(for循环检查字符是否在两个字符串中,然后使用if语句从string2中过滤掉这些字符)。但我真的很差劲,所以我可能做错了什么在python中过滤字符串中的字符。(如果字符在string2中,请从string1中筛选它们),python,string,character,filtering,Python,String,Character,Filtering,我对这段代码一直有语法问题。我在if语句行中得到一个语法错误。这段代码的目的是过滤掉字符串2中的字符,并在没有这些字符的情况下重新打印字符串1。我认为我写出来的逻辑是正确的(for循环检查字符是否在两个字符串中,然后使用if语句从string2中过滤掉这些字符)。但我真的很差劲,所以我可能做错了什么 def filter_string(str1, str2): newstr = "" for c in str1 and str2: if c == str1 an
def filter_string(str1, str2):
newstr = ""
for c in str1 and str2:
if c == str1 and != str2:
newstr += newstr + c
break
return newstr
谢谢你的帮助 下面是我在Python 2中的实现方法:
def filter_string(s, remove):
'''given a string, s, remove characters in string, remove'''
return s.translate(None, remove)
如果您使用的是Python 3:
def filter_string(s, remove):
return s.translate(str.maketrans('','',remove))
或者,如果您希望跨Python版本兼容:
import re
def filter_string(s, remove):
return re.sub('[' + remove + ']', '', s)
不管是哪种方式,下面是用法:
>>> filter_string('foo (*& bar', '&(*')
'foo bar'
下面是我机器上Python 3的计时:
import timeit
setup = """
def filter_string_1(s, remove):
return s.translate(str.maketrans('','',remove))
import re
def filter_string_2(s, remove):
return re.sub('[' + remove + ']', '', s)
"""
timeit.timeit("filter_string_1('foo (*& bar', '&(*')", setup)
timeit.timeit("filter_string_2('foo (*& bar', '&(*')", setup)
对我来说,返回:
1.6555187609919813
2.7981851549993735
因此,对于这个简单的示例,translate甚至比regex更快。以下是我在Python 2中的实现方法:
def filter_string(s, remove):
'''given a string, s, remove characters in string, remove'''
return s.translate(None, remove)
如果您使用的是Python 3:
def filter_string(s, remove):
return s.translate(str.maketrans('','',remove))
或者,如果您希望跨Python版本兼容:
import re
def filter_string(s, remove):
return re.sub('[' + remove + ']', '', s)
不管是哪种方式,下面是用法:
>>> filter_string('foo (*& bar', '&(*')
'foo bar'
下面是我机器上Python 3的计时:
import timeit
setup = """
def filter_string_1(s, remove):
return s.translate(str.maketrans('','',remove))
import re
def filter_string_2(s, remove):
return re.sub('[' + remove + ']', '', s)
"""
timeit.timeit("filter_string_1('foo (*& bar', '&(*')", setup)
timeit.timeit("filter_string_2('foo (*& bar', '&(*')", setup)
对我来说,返回:
1.6555187609919813
2.7981851549993735
因此,对于这个简单的示例,translate甚至比regex更快。非常接近您最初的尝试:
def filter_string(s, remove):
result = []
for c in s:
if c not in remove:
result.append(c)
return "".join(result)
print filter_string("foo (*& bar", "(*&)")
注意:这不是非常有效,因为您正在创建一个列表来存储与remove iterable不匹配的新字符串的字符列表,并最终通过将结果
列表与空字符串连接来返回新字符串
更好的方法是简单地使用str.translate()
方法:
>>> "foo (*& bar".translate(None, "(*&)")
'foo bar'
下面是两种方法的一些性能比较:
$ python -m timeit -s "from foo import filter_string" "filter_string('foo (*& bar', '(&*)')"
foo bar
100000 loops, best of 3: 2.32 usec per loop
$ python -m timeit "'foo (*& bar'.translate(None, '(*&)')"
1000000 loops, best of 3: 0.265 usec per loop
后一种方法大约快10倍。与最初的尝试相当接近:
def filter_string(s, remove):
result = []
for c in s:
if c not in remove:
result.append(c)
return "".join(result)
print filter_string("foo (*& bar", "(*&)")
注意:这不是非常有效,因为您正在创建一个列表来存储与remove iterable不匹配的新字符串的字符列表,并最终通过将结果
列表与空字符串连接来返回新字符串
更好的方法是简单地使用str.translate()
方法:
>>> "foo (*& bar".translate(None, "(*&)")
'foo bar'
下面是两种方法的一些性能比较:
$ python -m timeit -s "from foo import filter_string" "filter_string('foo (*& bar', '(&*)')"
foo bar
100000 loops, best of 3: 2.32 usec per loop
$ python -m timeit "'foo (*& bar'.translate(None, '(*&)')"
1000000 loops, best of 3: 0.265 usec per loop
后一种方法大约快10倍。如果您想要与第一次尝试非常相似的东西,这将起作用:
def filter_string(str1, str2):
newstr = ''
for c in str1:
if c not in str2:
print c
newstr += c
return newstr
如果您想要与第一次尝试非常相似的东西,这将起作用:
def filter_string(str1, str2):
newstr = ''
for c in str1:
if c not in str2:
print c
newstr += c
return newstr
当然,有多种方法可以做到这一点。就个人而言,这是最简单的逻辑:
def filter_string(str1, str2):
str3=''
for c in str1:
if c not in str2:
str3+=c
return (str3)
当然,有多种方法可以做到这一点。就个人而言,这是最简单的逻辑:
def filter_string(str1, str2):
str3=''
for c in str1:
if c not in str2:
str3+=c
return (str3)
python有很多类似于英语的结构,但你不能只是构造随机的句子,然后期望它们做你想做的事情。上面有很多错误都是由以下原因引起的:
对于str1和str2中的c:
和如果c==str1和!=str2:
就是这样的两个例子。我建议打开一个python教程,从头开始——花式的str.translate
或''。join(gen expression)
答案不会教你很多东西。python有很多类似英语的结构,但你不能只是构造随机的句子,并期望它们做你想做的事情。上面有很多错误都是由以下原因引起的:对于str1和str2中的c:
和如果c==str1和!=str2:
就是这样的两个例子。我建议打开一个python教程,从头开始-fancystr.translate
或''。join(gen expression)
答案不会教你太多。你能不能将remove
转换成一个集合,使用列表理解并比较结果?看起来这个集合将是一个非常小的改进,另外,您还需要克服转换为set所需的相对较长的时间->>timeit.timeit('i'在alpha中),setup=“alpha=set('abcdefghi')”)0.04773922599270085>>timeit.timeit('i'在alpha中,setup=“alpha='abcdefghi'))0.057853144011460245
我知道内置的str.translate
会更快,因为底层的实现是C/CPython。你能不能将remove
转换成一个集合,使用列表理解并比较结果?看起来这个集合会有很小的改进,另外,您还需要克服转换为set所需的相对较长的时间->>timeit.timeit('i'在alpha中),setup=“alpha=set('abcdefghi')”)0.04773922599270085>>timeit.timeit('i'在alpha中,setup=“alpha='abcdefghi'))0.057853144011460245
我知道一个事实,即内置的str.translate
将更快,因为底层实现将使用C/CPython。非常感谢。没有考虑只是安排,如果这样,非常感谢。没有考虑只是安排,如果这样的话。