2017-10-01 1 views
0

理想的には、ユーザーに「小」または「S」、「中」または「M」、「大」または「大」を入力することができます。 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

「beverageSize.lower()== 'medium''を使用してください。 –

+0

あなたは本当に物事を複雑にしました。 '' s '、' small '} 'で' beverageSize.lower()を使って 's'や' small'が入力されたかどうかを調べることができます。 –

+0

しかし、私はプロンプトを大文字と小文字を区別しないようにしようとしています。つまり、Medium、MEdium、MEdiUM、そして私が望む他の組み合わせです。 .lowercase()は、私にすべて小文字を与えるだけでしょうか? –

答えて

2

Pythonの変数の値をテストするためのスマートな方法があります。 if-elseの条件を使用した1つの方法は、コメント内に既に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を使用しています。ユーザーが辞書にキーとして存在しない単語を入力した場合は、beverageSizeに値Invalid 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' 

あるいはさらに良い、U実際のPythonスタイルを歌う:

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

これはPythonではありません。 –

+0

Coldspeed、そうです、私はこの人を混乱させるのを避けようとしましたが、醜いpythonコードで終わりました...意図したとおりに明確な実装を追加しました。 –

+0

まあ、まだ構文エラーがあります... –

関連する問題