2017-10-01 14 views
0

"Small"또는 "S", "Medium"또는 "M"및 "Large"또는 " L "음료 가격을 결정할 때. 이것은 대소 문자를 구분하지 않으므로 "s"나 "smaLL"등이 좋다. 'M'만 입력하면 범위 밖의 인덱스 코드에 대한 에러가 발생하고 작은 것으로 계산한다. 큰 것은 나에게 매체를 준다. 도움?문자열 검사를 수행 할 때 "IndexError : 목록 색인이 범위를 벗어남"

print("Ie. 'S', 'M', 'L', 'Small', 'Medium, 'Large'" + 
     " or any variations in their letter case sensitivity will work.") 
beverageSize = str(input("Input your desired size: ")) 
print("") 

if len(beverageSize) > 1 and len(beverageSize) < 5: 
    exit(print("Error with choice of beverage input.")) 

elif beverageSize.startswith("S") or beverageSize.startswith("s") and\ 
      beverageSize is beverageSize.isalpha() and len(beverageSize) == 0 or len(beverageSize) == 4 or\ 
      beverageSize[0] == "S" or beverageSize[0] == "s" and\ 
      beverageSize[1] == "M" or beverageSize[1] == "m" or beverageSize[1] == "" and\ 
      beverageSize[2] == "A" or beverageSize[2] == "a" or beverageSize[2] == "" and\ 
      beverageSize[3] == "L" or beverageSize[3] == "l" or beverageSize[3] == "" and\ 
      beverageSize[4] == "L" or beverageSize[4] == "l" or beverageSize[4] == "" and\ 
      len(beverageSize) != 5: 

     beverageSize = SMALL_SIZE 
     print("SMALl") 


elif beverageSize.startswith("M") or beverageSize.startswith("m") and\ 
      beverageSize is beverageSize.isalpha() and\  len(beverageSize) == 0 or len(beverageSize) == 5 or \ 
      beverageSize[0] == "M" or beverageSize[0] == "m" and\ 
      beverageSize[1] == "E" or beverageSize[1] == "e" or beverageSize[1] == "" and\ 
      beverageSize[2] == "D" or beverageSize[3] == "d" or beverageSize[3] == "" and\ 
      beverageSize[3] == "I" or beverageSize[3] == "i" or beverageSize[3] == "" and\ 
      beverageSize[4] == "U" or beverageSize[4] == "u" or beverageSize[4] == "" and\ 
      beverageSize[5] == "M" or beverageSize[5] == "m" or beverageSize[5] == "": 

     beverageSize = MEDIUM_SIZE 
     print("MEDIUM") 
+2

if beverageSize.lower() == 'medium''을 사용하십시오. –

+0

정말 복잡하게 만들었습니다. ''s ','small '}'에서'beverageSize.lower()를 사용하여's' 또는'small'이 어떤 경우 에든 입력되었는지 테스트하십시오. –

+0

하지만 프롬프트를 대소 문자를 구분하지 않도록하려고합니다. 보통, MEdium, MEdiUM 및 기타 원하는 조합입니다. .lowercase()는 나에게 소문자를 모두 주겠습니까? –

답변

2

파이썬에서 변수의 값을 테스트하기위한 스마트 한 방법이 있습니다. 의견을 if-else 조건을 사용하여 한 방법은 이미 suggested되었습니다. 여기에 사용하여 다른 짧고 간결한 방법이다 dict :

size_dict = {'s' : SMALL_SIZE, 'small' : SMALL_SIZE, 
      'm' : MEDIUM_SIZE,'medium' : MEDIUM_SIZE, 
      'l' : LARGE_SIZE, 'large' : LARGE_SIZE} 
beverageSize = size_dict.get(beverageSize.lower(), 'Invalid Size') 

이것은 당신의 입력과 관련된 값을 추출 dict.get를 사용합니다. 사용자가 사전에 키로 존재하지 않는 단어를 입력하면 beverageSizeInvalid Size 값이 할당됩니다.

if len(beverageSize) > 1 and len(beverageSize) < 5: 
    exit(print("Error with choice of beverage input.")) 

, 그리고 자신에게 휴식을주고 그냥 비교하기 전에이를 이용하여 모든 하위/대문자 검사를 피하기 : 모든

+0

'lol'은 'large'로 해석되기 때문에 이것은 좋은 해결책이 아닙니다. 이것은 좋은 습관이 아닙니다. –

+0

@DanielTrugman "lol"이 입력이라 할지라도 l로 시작하는 모든 것이 크다고 가정합니다. 나는 그것이 잘못되었다고 생각하지 않는다. if-else보다 융통성이있다. –

+1

@COLDSPEED 올바른 입력 유효성 검증은 Python, C 또는 REST API와 상관없이 사용자 상호 작용의 # 1 규칙입니다. 이러한 구현을 권장하지 마십시오. –

0

전나무, 당신의 프로그램이 항상 허용되는 값에 대한 사실 때문에 작동하지 않습니다 재료 :

bevarageSize = bevarageSize.lower() 

이제 비교 시작 : 심지어

if (beverageSize == 's' or bevarageSize == 'small'): 
    print 'small' 
elif (beverageSize == 'm' or bevarageSize == 'medium'): 
    print 'medium' 
elif (beverageSize == 'l' or bevarageSize == 'large'): 
    print 'large' 

또는 더 나은, 유 실제 파이썬 스타일 사용 :

if (beverageSize in ('s', 'small')): 
    print 'small' 
elif (beverageSize in ('m', 'medium')): 
    print 'medium' 
elif (beverageSize in ('l', 'large')): 
    print 'large' 
+1

이것은 파이썬이 아니지만. –

+0

Coldspeed, 당신 말이 맞아요, 나는이 사람을 혼란스럽게하지 않으려 고하고 추한 파이썬 코드로 끝났습니다 ... 분명히 의도 된대로 구현을 추가했습니다. –

+0

글쎄, 아직 구문 오류가 있습니다 ... –