2017-10-06 3 views
1

Quelque chose que je n'ai jamais trouvé une manière concise de faire est de comparer une chaîne avec plusieurs ensembles, ou peut-être un long qui donne une sortie significative. Ceci est mon code actuel:Concision de Python: Comparaison de chaîne à plusieurs ensembles avec valeur de retour

def input(): 
    text = input("Choose a number: ").lower() 
    if "1" in text or "one" in text: return 1 
    elif "2" in text or "two" in text: return 2 
    ... and so on... 
    elif "9" in text or "nine" in text: return 9 
    else: return 0 

Mon but est de le rendre un peu plus concis, compte tenu de la laideur, il est en ce moment.

En outre, un peu d'une étiquette sur la question: est-il plus rapide à faire, ou:

if any(x in text for x in (["1", "one"])): return 1 

Lequel est considéré comme plus mainstream?

Désolé; mon Python est vraiment d'entrée de gamme.

--- EDIT ---

Toutes mes excuses pour la confusion; Je voulais dire quelque chose de plus généralisable, comme pour cela:

def input(): 
     text = input("Give an input: ").lower() 
     if any(x in text for x in (["eggplant", "emoji", "purple"])): return 1 
     elif any(x in text for x in (["tomato", "red", "tomatina"])): return 2 
     ... and so on... 
     elif any(x in text for x in (["lettuce", "green", "avatar"])): return 9 
     else: return 0 
+1

Peut-être que regex? En outre, l'entrée peut être seulement un nombre ou un chiffre (pas une "phrase")? pouvez-vous faire ces hypothèses? – Aviad

+0

Désolé, ce n'est pas mon code original; J'ai juste utilisé un format qui exprimait ce que je voulais dire. L'entrée va être une chaîne. Je m'excuse pour mon manque d'expertise en python, mais je ne sais pas vraiment comment utiliser regex; pourriez-vous me donner un petit exemple? – XymphosCraK

Répondre

1

En fonction de la régularité de votre requêtes, vous pouvez utiliser une sorte de boucle:

for i, s in enumerate('one two three four ... nine'.split(), 1): 
    if str(i) in text or s in text: 
    return i 
return 0 
+0

Bonne réponse, cependant, vous devriez vérifier «str (i) dans le texte» pas «je dans le texte». –

+0

@MosesKoledoye Fait, avait dans ma première version :) – schwobaseggl

0

Je voudrais créer une fonction de normalisation pour que:

_NORMALIZE_DICT = { 
    "one": "1", 
    "two": "2", 
    ... 
} 

def normalize(test): 
    return _NORMALIZE_DICT.get(test.lower(), test) 

puis

def input(): 
    text = normalize(input("Choose a number: ")) 
    try: 
     return int(text) 
    except ValueError: 
     return 0 
+1

Ce n'est pas exactement ce qu'ils veulent. Ils testent avec 'in' pas' == '. Si 'text' est' 'quelque chose'' par exemple, le code de OP retournera' 1'. –

+0

Je vais aller clarifier mon message original; Désolé pour la confusion. Merci @MosesKoledoye – XymphosCraK