2017-03-27 10 views
-1

문자열 입력을 돼지 라틴어로 변경하는이 함수를 만들었습니다. 인덱스가 범위를 벗어나지 만 검사 방법이 범위를 벗어난 인덱스인지 확인하려고했습니다.인덱스가 범위를 벗어 났는지 확인하려고했으나 사용 된 코드가 범위를 벗어나는 인덱스를 제공하고 있습니까?

def simple_pig_latin(input, sep=' ', end='.'): 
    words=input.replace(" ", " ").split(sep) 
    new_sentence="" 
    Vowels= ('a','e','i','o','u') 
    Digit= (0,1,2,3,4,5,6,7,8,9) 
    cons=('b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z') 
    characters= ('!','@','#','$','%','^','&','*','.') 
    for word in words: 
     if word[0] == " ": 
      new_word=word 
     else: 
      if word[0] in Vowels: 
       new_word= word+"way" 
      if word[0] in Digit: 
       new_word= word 
      if word[0] in cons: 
       first_letter=word[0] #saves the first letter 
       change= str(word) #change to string      
       rem= change.replace(first_letter,'') 
       put_last= rem+first_letter #add letter to end 
       new_word= put_last+"ay" 
      if word[0] in characters: 
       new_word= word 
      new_sentence= new_sentence+new_word+sep 

new_sentence= new_sentence.strip(sep)+end 
return new_sentence 

당신은 비어 있으면 문이 확인되는 경우 첫 번째 볼 수 있습니다,하지만 난이 정확한 오류 받고 있어요 :

"9 호선 IndexError : 밖으로 문자열의 인덱스를 다음과 같이

은 참조 범위의 "

어떻게 빈 시퀀스를 확인할 수 있습니까? 나는 if 문이 작동하지 않기 때문에 범위 내의 단어 (len (단어))를 사용할 수 없습니다. 그것은 객체가 subscriptable하지 않다는 것을 말해 줄 것입니다. 루프에서

+1

"당신은 볼 수 있습니다 첫 번째 if 문은 비어 있는지 확인합니다. "- 그렇지 않습니다. 'word [0]'에 액세스하려고 시도하고'word [0]'이 공백인지 확인합니다. 'word [0]'이 있다고 가정합니다. 단어'가 비어 있는지 확인하는 것과 같은 것은 아닙니다. – user2357112

+0

이 질문에 대한 이유는 무엇입니까? 가난한 표를 얻지 않도록 오류를 수정하고 싶습니다. –

답변

1

당신은 word 당신이 공간에 따라 분할하고 있기 때문에, 전혀 보장되지 않으며, 1 개 이상의 공간이있을 때 빈 필드가 발행 할 수있는 비어 있지 않은 것으로 가정합니다.

>>> "a b".split(" ") 
['a', '', 'b'] 

그래서 당신은 (우주와 같은 문자 만 작동), 인수없이 split()를 사용하거나 다른 구분 기호를 사용하는 경우, 지능형리스트에서 예를 들어, 루프 전에 빈 필드를 필터링 할 수 있습니다 :

words= [ w for w in input.split(sep) if w ] 

이제 words의 각 항목에는 1 자 이상이 있어야합니다.

편집 : 그래서 split과 빈 문자열을 필터링에 대한 좋은 설명은 많은,하지만 당신이 hello world에 대한 구분자로 l를 사용할 수 있기 때문에 기본에 이렇게 다시, 그것을 잘라하지 않는 것 :

def simple_pig_latin(input, sep=' ', end='.'): 
    words=input.split(sep) 
    new_sentence="" 
    Vowels= ('a','e','i','o','u') 
    Digit= (0,1,2,3,4,5,6,7,8,9) 
    cons=set(('b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z')) 
    characters= ('!','@','#','$','%','^','&','*','.') 
    new_sentence = [] 

    for word in words: 
     if word: 
      if word[0] == " ": 
       new_word=word 
      else: 
       if word[0] in Vowels: 
        new_word= word+"way" 
       elif word[0] in Digit: 
        new_word= word 
       elif word[0] in cons: 
        first_letter=word[0] #saves the first letter 
        change= str(word) #change to string 
        rem= change.replace(first_letter,'') 
        put_last= rem+first_letter #add letter to end 
        new_word= put_last+"ay" 
       elif word[0] in characters: 
        new_word= word 
       new_sentence.append(new_word) 
     else: 
      new_sentence.append(word) 

    return sep.join(new_sentence)+end 

코드 변경 : 결국 join를 사용

  • 사용 목록을 다시 조인
  • 단지 비어있는 단어를 필터링 만에 넣습니다 목록 어쨌든
  • 에게 지금 빠른 조회

에 대한 elif 대신 consomns에 대한 set를 사용

  • if의 많은 :

    print(simple_pig_latin("hello world",sep='l')) 
    

    수익률 :

    ehayllo worwaylday. 
    
  • +0

    그건 범위를 벗어난 오류를 해결! 나는 아직도이 테스트 케이스에 실패하고있다 : AssertionError : 'ehaylo worwaylday'! = 'ehayllo worwaylday'나는 이것이 separator = "l"을 갖는 것과 관련이 있다는 것을 알고있다.스트립을 제거하면 모든 테스트 케이스가 실패하므로 어떻게 추가로 보관할 수 있습니까? –

    +0

    최종 반환 문을 연결할 수 없다는 메시지가 나타납니다. TypeError : 목록 ("str"이 아닌) 만 연결하여 –

    +0

    을 테스트했습니다. 어쩌면 복사/붙여 넣기보다는 내 솔루션을 타이핑하여 재 입력 한 것일 수도 있습니다. –