2017-10-01 4 views
0

Idéalement, j'aimerais pouvoir demander aux utilisateurs de "Small" ou "S", "Medium" ou "M" et "Large" ou " L "lors de la détermination des prix des boissons. Tout est insensible à la casse, donc "s" ou "smaLL" est bon, etc. Si je saisis juste un 'M', j'obtiens une erreur pour un code d'index hors de portée, et il calcule comme un petit. Un gros me donne un médium. Aidez-moi?"IndexError: indice de liste hors de portée" lors de la vérification de chaîne

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

S'il vous plaît utilisez simplement 'si beverageSize.lower() == « medium''. –

+0

vous avez vraiment fait des choses beaucoup trop compliquées. Utilisez 'beverageSize.lower() dans {' 's', 'small'} 'pour tester si' s' ou 'small' a été saisi, dans tous les cas. –

+0

mais j'essaie de rendre l'invite insensible à la casse, donc Medium, MEdium, MEdiUM et toute autre combinaison que je souhaite. .lowercase() me donnerait tout en minuscule, n'est-ce pas? –

Répondre

2

Il existe des moyens plus intelligents pour tester la valeur des variables dans python. Une méthode utilisant les conditions if-else a déjà été suggested dans les commentaires. Voici une autre méthode courte, concise en utilisant un 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') 

Il utilise dict.get pour extraire des valeurs associées à votre entrée. Si l'utilisateur a entré un mot qui n'existe pas en tant que clé dans le dictionnaire, la valeur Invalid Size est attribuée à beverageSize.

+0

Ce n'est pas une bonne solution, car 'lol' sera aussi interprété comme 'grand'. Ce n'est pas une bonne pratique. –

+0

@DanielTrugman L'hypothèse est que tout ce qui commence par l est considéré comme grand, même si "lol" est l'entrée. Je ne pense pas qu'il y ait quelque chose qui cloche, si c'est du tout, c'est plus flexible qu'un if-else. –

+1

@COLDSPEED La validation correcte des entrées est la règle n ° 1 de l'interaction utilisateur, que ce soit Python, C ou une API REST. Merci de ne pas encourager de telles implémentations. –

0

Firs de tous, votre programme ne fonctionnera pas parce que ce sera toujours vrai pour les valeurs autorisées:

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

Ensuite, donnez-vous une pause et éviter tous les chèques inférieurs/majuscules en utilisant simplement avant de comparer ce choses:

bevarageSize = bevarageSize.lower() 

commencer maintenant la comparaison:

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

Ou encore mieux, u chanter vrai style Python:

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

Ce n'est pas python, cependant. –

+0

Coldspeed, vous avez raison, j'ai essayé d'éviter de confondre ce gars et fini avec le code python laid ... Ajouté une implémentation claire, comme prévu. –

+0

Eh bien, il a encore des erreurs de syntaxe ... –