2014-03-13 52 views
1

我一直有这个代码的语法问题。 if语句行出现语法错误。此代码的目的是过滤掉字符串2中的字符,并在没有它们的情况下重新打印字符串1。我认为我的逻辑在我写出来的方式上是正确的(for循环来检查字符是否在两个字符串中,然后是if语句来过滤掉string2中的那些字符)。但我真的很糟糕,所以我可能做错了什么。从python中的字符串中过滤字符。 (如果字符在string2中,从string1过滤它们)

def filter_string(str1, str2): 
    newstr = "" 

    for c in str1 and str2: 
     if c == str1 and != str2: 
      newstr += newstr + c 
      break 
    return newstr 

感谢您的帮助!

+0

蟒蛇有很多英语样构建的,但你不能只建立随机的句子,并期望他们去做你想让他们什么。你在上面有很多错误源于这个:'对于str1和str2中的c:'和'if c == str1 and!= str2:'就是这样两个例子。我建议打开一个python教程,从头开始 - 花哨的'str.translate'或'''.join(gen expression)'答案不会教你太多。 – roippi

回答

1

如果你想非常相似,你的第一次尝试的东西,这将工作:

def filter_string(str1, str2): 
newstr = '' 
for c in str1: 
    if c not in str2: 
     print c 
     newstr += c 

return newstr 
+1

非常感谢。没有考虑只是安排,如果这样。 – user3413477

3

以下是我会做它在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 

所以翻译的速度甚至比正则表达式这个简单的例子。

0

坚持公平closly您最初的尝试:

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", "(*&)") 

注:这是您要创建一个列表来存储新的字符串的字符的列表是不是非常非常有效,唐” t匹配remove迭代,最后通过将result列表与一个空字符串结合来返回一个新字符串。

更好的方法是简单地使用str.translate()方法:

>>> "foo (*& bar".translate(None, "(*&)") 
'foo bar' 

这里有两种方法之间的一些性能comparisions:

$ 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倍。

+0

您能否将'remove'转换为一个集合,使用列表理解并比较结果? – thefourtheye

+0

看起来这个集合是一个非常小的改进,再加上你需要克服转换为集合所需的相对较大的时间 - >>> >>> timeit.timeit(“alpha”中的'i',setup =“alpha =设定( 'ABCDEFGHI') “) 0.047739225992700085 >>> timeit.timeit(” 的 'i' 在阿尔法”,设置= “阿尔法= 'ABCDEFGHI”') 0.057853144011460245' –

+0

我知道一个事实,即内置'由于底层实现将在C/CPython中,因此'str.translate'会更快。 –

0

当然有多种方法可以做到这一点。个人这是最简单的逻辑来folow中:

def filter_string(str1, str2): 
    str3='' 
    for c in str1: 
     if c not in str2: 
     str3+=c 
    return (str3)