2016-10-02 6 views
-2

Ich mache derzeit ein interaktives System mit Python, das verstehen und antworten kann. Daher gibt es viele Bedingungen für die Analyse und Verarbeitung der Maschine. Für z. nehmen Sie den folgenden Code (nur als Referenz):Gibt es eine Möglichkeit, zu viele andere Bedingungen zu entfernen?

if ('goodbye') in message:       
     rand = ['Goodbye Sir', 'Jarvis powering off in 3, 2, 1, 0'] 
     speekmodule.speek(rand,n,mixer) 
     break 

    if ('hello') in message or ('hi') in message: 
     rand = ['Wellcome to Jarvis virtual intelligence project. At your service sir.'] 
     speekmodule.speek(rand,n,mixer) 

    if ('thanks') in message or ('tanks') in message or ('thank you') in message: 
     rand = ['You are wellcome', 'no problem'] 
     speekmodule.speek(rand,n,mixer) 

    if message == ('jarvis'): 
     rand = ['Yes Sir?', 'What can I doo for you sir?'] 
     speekmodule.speek(rand,n,mixer) 

    if ('how are you') in message or ('and you') in message or ('are you okay') in message: 
     rand = ['Fine thank you'] 
     speekmodule.speek(rand,n,mixer) 

    if ('*') in message: 
     rand = ['Be polite please'] 
     speekmodule.speek(rand,n,mixer) 

    if ('your name') in message: 
     rand = ['My name is Jarvis, at your service sir'] 
     speekmodule.speek(rand,n,mixer) 

So ist es eine Möglichkeit, in der ich alle diese, wenn sonst Bedingungen ersetzen ?? Weil es viel mehr Bedingungen geben wird und die Ausführung langsamer wird.

+1

Der erste Schritt besteht darin, unnötige Parens zu entfernen, d. H. Einfach 'if 'hallo' zu schreiben. – skovorodkin

+0

Hier ist eine Lösung mit Wörterbüchern: http://stackoverflow.com/questions/60208/replacements-for-switch-statement-in-python – imant

+0

Ja, Sie können ein Wörterbuch wie vorgeschlagen verwenden, um eine Art von "switch ... case ... ". Aber mit RegEx, um das "Wort in Nachricht" zu implementieren. Es reduziert jedoch nicht die Komplexität Ihres Algorithmus: Sie müssen alle Fälle überprüfen. –

Antwort

1

Machen Sie eine exklusive "if":

if 'goodbye' in message:       
    rand = ['Goodbye Sir', 'Jarvis powering off in 3, 2, 1, 0'] 

elif 'hello' in message or 'hi' in message: 
    rand = ['Wellcome to Jarvis virtual intelligence project. At your service sir.'] 

elif 'thanks' in message or 'tanks' in message or ('thank you') in message: 
    rand = ['You are wellcome', 'no problem'] 

elif message == 'jarvis': 
    rand = ['Yes Sir?', 'What can I doo for you sir?'] 

elif 'how are you' in message or 'and you' in message or ('are you okay') in message: 
    rand = ['Fine thank you'] 

elif '*' in message: 
    rand = ['Be polite please'] 

elif 'your name' in message: 
    rand = ['My name is Jarvis, at your service sir'] 

else: 
    raise NotImplementedError("What to do?") 

speekmodule.speek(rand, n, mixer) 

Mit einer Abbildung von RegEx:

mapping = { 
    r"\bgoodbye\b": ['Goodbye Sir', 'Jarvis powering off in 3, 2, 1, 0'], 
    r"\bhello\b": ['Wellcome to Jarvis virtual intelligence project. At your service sir.'], 
    ...} 

for regex, rand in mapping.items(): 
    if re.search(message, flags=re.I): 
     break 
else: 
    raise NotImplementedError("What to do?") 
speekmodule.speek(rand, n, mixer) 

Es liegt an Ihnen zu entscheiden.

0

if/elif/else ist eine natürliche Möglichkeit, diese Art von Code in Python zu strukturieren. Wie @imant bemerkt, können Sie den dict-basierten Ansatz für den Fall einfacher Verzweigung verwenden, aber ich sehe eine leicht komplexe Logik in Ihren Prädikaten if, so dass Sie in jedem Fall alle Prädikate überprüfen müssen und Sie keine Leistung haben werden Gewinne mit einer anderen Codestruktur.

Obwohl kann es ein wenig besser lesbar und leichter zu pflegen, wenn Sie Ihre Prädikate und Aktionen wie dieser Faktor aus:

from collections import OrderedDict 

def goodbye_p(message): 
    return 'goodbye' in message 

def goodbye_a(): 
    rand = ['Goodbye Sir', 'Jarvis powering off in 3, 2, 1, 0'] 
    # As @Moinuddin Quadri I also assume that your `speek` method 
    # says random message from a list. 
    # Otherwise you can use `random.choice` method 
    # to get a random message out of a list: `random.choice(messages)`. 
    speekmodule.speek(rand, n, mixer) 


def hello_p(message): 
    return 'hello' in message or 'hi' in message 

def hello_a(): 
    rand = ['Wellcome to Jarvis virtual intelligence project. At your service sir.'] 
    speekmodule.speek(rand, n, mixer) 

# Use `OrderedDict` instead of `dict` to control order 
# of checks and actions. 
branches = OrderedDict([ 
    # (predicate as key, action as value) 
    (goodbye_p, goodbye_a), 
    (hello_p, hello_a), 
]) 

for predicate, action in branches.items(): 
    if predicate(message): 
     action_result = action() 
     # You can add some logic here based on action results. 
     # E.g. you can return some special object from `goodbye_a` 
     # and then shut down Jarvis here. 
     # Or if your actions are exclusive, you can add `break` here. 

Wenn alle Prädikate gleich sind und nur Schecks enthalten String, dann ist möglicherweise leistungsfähiger, Tupel (zB ('hello', 'hi')) als dict keys zu haben. Dann können Sie über diese Tasten wie folgt durchlaufen:

for words, action in branches.items(): 
    if any(word in message for word in words): 
     action() 
0

erstens ein dict Objekt mit dem Schlüssel erstellen, wie tuple des Zeichenfolge, die Sie in Ihrem message passen wollen und es mit dem Wert string die Ihre Jarvis ist wohl zu reagieren . Zum Beispiel:

jarvis_dict = { 
    ('goodbye',) : ['Goodbye Sir', 'Jarvis powering off in 3, 2, 1, 0'], 
    ('hello', 
    'hi')  : ['Wellcome to Jarvis virtual intelligence project. At your service sir.'], 
    ('thanks', 
    'tanks', 
    'thank you') : ['You are wellcome', 'no problem'], 
    ('jarvis',) : ['Yes Sir?', 'What can I doo for you sir?'], 
    ('how are you', 
    'and you', 
    'are you okay'): ['Fine thank you'], 
    ('*',)  : ['Be polite please'], 
    ('your name',): ['My name is Jarvis, at your service sir'] 
} 

nun jede Taste von Ihnen iterieren dict zu überprüfen, ob eine Unterkette der Teil der Nachricht ist und wenn es eine Übereinstimmung vorhanden ist, rufen Sie die speekmodule.speek(rand,n,mixer) Funktion als:

for key, value in jarvis_dict.items(): 
    if any(item in message for item in key): 
     speekmodule.speek(value, n, mixer) 

Hinweis: Hier gehe ich davon aus, dass speekmodule.speek(value, n, mixer) in Ihrem Code funktioniert, da keine Informationen in Ihrem Code in Bezug auf es gibt. Ich habe gerade Ihre rand durch value ersetzt, da es dieselbe Liste von str ist, die von der dict zurückgegeben wird, die in Ihrem Code verwendet wird.

+0

Wahrscheinlich möchten Sie 'random.choice (value)' verwenden, um eine zufällige Antwort aus einer Reihe vordefinierter Varianten zu erhalten. – skovorodkin

+2

Wie ich bereits in der Antwort erwähnt habe, bin ich mir nicht sicher, wie sich die 'speekmodule.speek()' Funktion verhält, und ich gehe davon aus, dass diese Funktion im OP gut funktioniert (und 'random.choice (value)' heißt intern durch die '.speek()' Funktion). Mein Code soll die gleiche Funktionalität wie das OP bieten. –

0

Verwenden Wörterbuch:

someCollections = { 
    'goodbye': "Something1", 
    'hello': "Somthing2", 
    ... 
} 

speekmodule(someCollections [SomeKey],...) 
+3

Es ist keine gute Übung, eingebaute Namen (wie "dict") für Variablen zu verwenden. – Dartmouth

+0

Antwort aktualisiert. – David

Verwandte Themen