2014-02-05 5 views
-1
def tlower(str1): 
    list = list(str1) 
    final = '' 
    for char in range(0,len(str1)): 
     if list[char] in UPPERCASE: 
      for ascii in range(0,len(UPPERCASE)): 
       if list[char] == UPPERCASE[ascii]: 
        list[char] = LOWERCASE[ascii] 
     final += list[char] 
    return final 

만들기 참고 - 대문자와 소문자를 모두 대문자/소문자의 문자열내 자신의 문자열 함수

주 - (.. 등 교체) 파이썬에 내장 된 문자열 기능을 사용할 수 없습니다

나는이 함수를 가지고 모든 소문자로 바꿀 수있다. (예, 내장 함수가 있다는 것을 알고있다.) 그러나 내가 만든 다른 문자열 함수와 비교하면 상당히 길다. 이러는거야?

+3

가리스트'list'를 호출하지 마십시오. ** 특히 ** list() 내장 명령을 실제로 사용한다면 **. 범위 (len (something)) 이상으로 반복하고 싶지도 않습니다. 열거를 사용하십시오. – geoffspear

+0

대신 대문자 목록을 검색하는 대신,'list [char] + = LOWERCASE [UPPERCASE.index (list [char])]'나는 이것을 테스트하지 않았다. 귀하의 내부 루프를 제거합니다. – turbo

답변

5
UPPERCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
LOWERCASE = "abcdefghijklmnopqrstuvwxyz" 

def to_lower(s, trans=dict(zip(UPPERCASE, LOWERCASE))): 
    return ''.join(trans.get(ch,ch) for ch in s) 

print to_lower('This Is a TEST') # => 'this is a test' 

편집 :

zip()

zip('ABC', 'abc') # => [('A','a'), ('B','b'), ('C','c')] 

dict()이 사전을 만드는 즉, 두 개의리스트를 취하고 값 쌍을 반환 -

{'A':'a', 'B':'b', 'C':'c'} 

trans.get(x, y)가있다,이 경우 보다 컴팩트 한 방법으로 표현하면 trans[x] if x in trans else y입니다. 이 경우 "이 소문자 버전이 있으면이 문자를 반환하고, 그렇지 않으면 원래 문자를 돌려줍니다."

그리고 .join이 마음에 들지 않는다면 어떨까요? 완성도를 들어

from operator import add 

def to_lower(s, trans=dict(zip(UPPERCASE, LOWERCASE))): 
    return reduce(add, (trans.get(ch,ch) for ch in s), '') 
+0

.join을 사용할 수 없습니다. 이것은 문자열 함수입니다. – Brian

+0

와우. 그것은 내가 쓴 것입니다. – hughdbrown

+0

@Brian : [trans.get (ch, ch) in ch]에 루프를 적용하고 각각을 동일한 효과의 문자열에 추가 할 수 있습니다.하지만 이것은 매우 비효율적입니다. – geoffspear

1

:

def to_lower(string): 
    ords = (ord(c) for c in string) 
    return ''.join(chr(o + 32 * (65 <= o <= 90)) for o in ords) 
+1

ASCII와 호환되지 않는 코덱에서는 작동하지 않지만 해당 숫자에는 +1이 적용됩니다. :) – pradyunsg