2016-09-09 6 views
0

이 코드를 통해 문자열 s에 나타나는 모든 점 (.)을 정확히 대칭 적으로 반대 위치에있는 문자로 바꿉니다. 예를 들어 :Python에서 잘못된 결과를내는 함수

i 번째 위치의 요소가 len(s)-i-1 번째 위치의 요소에 의해 대체되어야한다 s=a.bcdcbba이면 .b

즉 의해 대체되어야한다. 이 함수는 g...., .g... 등의 잘못된 출력을 제공합니다. 어떤 도움이 필요합니까? chepner의 방법 @

def replacedots(s): 

    for i in range(0,len(s)): 
     if s[i]==".": 
       s=s.replace(s[i],s[len(s)-i-1],1) 

    return s  
+2

' "foo.bar"'무엇에 대한? –

+0

점 뒤에있는 캐릭터를 의미합니까? –

+0

's.replace'는'i'의 점을 대체하지 않고 첫 번째 점을 대체하기 때문입니다. –

답변

1

:

def replacedots(s): 
    return ''.join(x if x !='.' else y for x, y in zip(s, reversed(s))) 

대안 :

def replacedots(s): 
    return ''.join(c if c != '.' else s[-i - 1] for i, c in enumerate(s)) 

위치 i의 문자 위치 len(s) - i - 1의 문자는 점은 점 유지하는 .이다.

예 :

s = "foo.bar" 
+1

니스! 반대 문자를 얻기에''[-i-1]'충분하지 않습니까? –

+0

확실하다. 다음 번에 개선 할 수있는 답을 자유롭게 편집 해 주셔서 감사합니다 :) –

+1

Some - me :) -'x if x! = '.' y를 x, y를 zip (s, 역순으로)'하고 직접 인덱싱을 피하십시오. 어느 쪽이든, 생성기 대신에리스트 이해력을'' '.join'에 전달하는 것이 더 빠릅니다. (이상하게도,'zip' 버전은 생성기가 사용될 때'enumerate' 버전보다 빠르지 만, 둘 다 list comprehensions으로 사용될 때는 그렇지 않습니다.) – chepner