我的代码存在语法问题。我在if语句行上遇到语法错误。此代码的目的是过滤掉字符串2中的字符,并在没有它们的情况下重新打印字符串1。我认为我的逻辑在我如何写出来是正确的(循环检查字符是否在两个字符串中,然后是if语句来过滤掉string2中的那些字符)。但我真的很蹩脚,所以我可能做错了什么。
def filter_string(str1, str2):
newstr = ""
for c in str1 and str2:
if c == str1 and != str2:
newstr += newstr + c
break
return newstr
感谢您的帮助!
答案 0 :(得分:4)
以下是我在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
因此,对于这个简单的例子,翻译甚至比正则表达式更快。</ p>
答案 1 :(得分:1)
如果您想要与第一次尝试非常相似的东西,这将有效:
def filter_string(str1, str2):
newstr = ''
for c in str1:
if c not in str2:
print c
newstr += c
return newstr
答案 2 :(得分:0)
完全坚持你最初的尝试:
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", "(*&)")
注意:这并不是非常有效,因为您正在创建一个列表来存储新字符串的字符列表,该字符串与删除的可迭代字符串不匹配最后通过使用空字符串加入result
列表来返回一个新字符串。
更好的方法是简单地使用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倍。
答案 3 :(得分:0)
当然有多种方法可以做到这一点。就个人而言,这是最简单的逻辑:
def filter_string(str1, str2):
str3=''
for c in str1:
if c not in str2:
str3+=c
return (str3)