2014-03-13 3 views
1

이 코드의 구문 문제가 발생했습니다. if 문에 구문 오류가 발생합니다. 이 코드의 목적은 문자열 2의 문자를 걸러 내고 문자열 1을 다시 인쇄하는 것입니다. 나는 내 논리가 올바른 방법이라고 생각한다. (루프가 두 문자열 모두에 있는지 확인하고 if 문을 사용하여 string2의 문자를 필터링한다.) 그러나 나는 정말 엉터리이므로 뭔가 잘못했을 수도 있습니다.파이썬에서 문자열의 문자를 필터링합니다. (문자가 string2에있는 경우 문자열 1에서 필터링하십시오.)

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

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

도움 주셔서 감사합니다! 파이썬 3의 경우

def filter_string(s, remove): 
    '''given a string, s, remove characters in string, remove''' 
    return s.translate(None, remove) 

: 여기

+0

python은 영어와 비슷한 구문을 많이 가지고 있지만 임의의 문장을 구성하여 원하는대로 할 수는 없습니다. 위의 코드에서 str1과 str2의'for c :'와'c == str1과!= str2 :'는 두 가지 예입니다. 파이썬 튜토리얼을 열고 처음부터 시작하는 것이 좋습니다 - 멋진 '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

내가 파이썬 2에서 그것을 할 거라고 방법

import re 
def filter_string(s, remove): 
    return re.sub('[' + remove + ']', '', s) 
:

def filter_string(s, remove): 
    return s.translate(str.maketrans('','',remove)) 

을 또는 당신은 파이썬 버전에서 호환성을 원하는 경우

어느 쪽이든, 여기에 사용법이 있습니다 :

>>> filter_string('foo (*& bar', '&(*') 
'foo bar' 

여기에 내 컴퓨터에 파이썬 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", "(*&)") 

참고 : 새 문자열의 문자 목록을 저장하는 목록을 만들로이 몹시 매우 효율적이지 그 돈 ' remove iterable과 일치하고 마지막으로 result 목록을 빈 문자열과 결합하여 새 문자열을 반환합니다.

>>> "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 배 빠른 약

더 좋은 방법은 단순히 str.translate() 방법을 사용하는 것입니다. 첫 번째 시도와 매우 유사 뭔가를하려는 경우

+0

'remove'를 집합으로 변환하고, 목록 이해력을 사용하고, 결과를 비교해 주시겠습니까? – thefourtheye

+0

세트가 매우 작은 개선으로 보이고 세트로 변환하는 데 걸리는 상대적으로 큰 시간을 극복해야 할 필요가있는 것 같습니다. - >>> timeit.timeit (" 'i'in i alpha, setup ="alpha " 0.047739225992700085 >>> timeit.timeit ("i"는 'alpha', setup = "alpha = 'abcdefghi'") 0.057853144011460245' –

+0

사실 내장 함수는' 'str.translate''는 기본 구현이 C/CPython에 있기 때문에 더 빠릅니다. –

0

은 물론이 작업을 수행하는 여러 가지 방법이 있습니다. 개인적으로 가장 간단한 논리는 다음과 같습니다.

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