2016-07-13 11 views
1

Ich habe 3 Variablen x, y, z, die unterschiedliche Werte haben werden, abhängig von dem Ergebnis von 3 Tests, die ich durchführen werde. Also gibt es 8 mögliche Ergebnisse der Tests. Diese 8 Ergebnisse stimmen mit den entsprechenden Ergebnissen überein, die in einem Diktat namens dic gespeichert sind. Ich muss die entsprechenden Ergebnisse an die Variable x, y, z übergeben.Python, wie man das Ergebnis eines Wörterbuchs nennt und das Ergebnis an einige Variablen weitergibt

Der Code wie folgt:

fetch = requests.get('http://www.example.com') 

match_M = re.search(r'something1...' , fetch.text) 
if match_M != None: match_M = 1 
else: match_M = 0 

match_K = re.search(r'something2...' , fetch.text) 
if match_K != None: match_K = 1 
else: match_K = 0 

match_T = re.search(r'something3...' , fetch.text) 
if match_T != None: match_T = 1 
else: match_T = 0 

outcome = [[0,3,1], [0,2,1,], [0,3,2], [0,2,1], [1,3,1], [1,3,2], [2,3,1], [3,3,1]] 

dic = {'111':outcome[0], '110':outcome[1], '101':outcome[2], '100':outcome[3], '011':outcome[4], '010':outcome[5], '001':outcome[6], '000':outcome[7]} 

X_num = str(match_M) + str(match_K) + str(match_T) 

print dic['X_num'] 

x, y, z = dic['X_num'] 

Gibt es einen besseren Weg, es zu schreiben, wo ich muss einfach nicht verwenden str (match_M) + str (match_K) + str (match_T), vielleicht könnte ich benutze sowas wie dic ['match_M + match_K + match_K']

Sorry, wenn das zu dumm klingt, fange ich gerade erst an zu lernen.

+1

Wenn schon der Code funktioniert und Sie es nur helfen, verbessern wollen, [Codereview] (http: // Codereview. stackexchange.com/) ist eine geeignetere Site als StackOverflow. – skrrgwasme

+0

Danke für die Empfehlung, @skrrgwasme – sam

Antwort

1

Vielleicht wäre so etwas eine Verbesserung? Diese

fetch = requests.get('http://www.example.com') 

match_M = 0 if re.search(r'something1...' , fetch.text) else 4 
match_K = 0 if re.search(r'something2...' , fetch.text) else 2 
match_T = 0 if re.search(r'something3...' , fetch.text) else 1 

index = match_M + match_K + match_T 

outcomes = [[0,3,1], [0,2,1], [0,3,2], [0,2,1], [1,3,1], [1,3,2], [2,3,1], [3,3,1]] 

x, y, z = outcomes[index] 

basiert auf der Beobachtung, dass Sie den Aufbau einer 3-stelligen Binärzahl, so dass die Ziffern sind in der 4s Ort, der 2s Ort und der 1s Ort. Ich habe 1s und 0s von deinem Schema umgekehrt, da auf diese Weise die "Ergebnisse" in der gleichen Reihenfolge sind wie die Binärzahlen, die du aufbaust.

EDIT

Ein wenig "Code Golf" (sorry):

fetch = requests.get('http://www.example.com') 

x, y, z = [[0,3,1], [0,2,1], [0,3,2], [0,2,1], [1,3,1], [1,3,2], [2,3,1], [3,3,1]][ 
    sum(2**i * (0 if re.search(pattern, fetch.text) else 1) 
     for i, pattern in enumerate([r'something3', r'something2', r'something1']))] 
+0

Ich denke 'Ergebnisse [index]' anstelle von 'dic [index]'? –

+0

@RahulKP Danke! Ganz recht. – smarx

+0

Vielen Dank! @smarx. Ich schätze die Hilfe sehr. – sam

1

Ich würde wahrscheinlich das Problem etwas anders angehen, zumindest für die drei folgenden Zeilen

outcome = [[0,3,1], [0,2,1,], [0,3,2], [0,2,1], [1,3,1], [1,3,2], [2,3,1], [3,3,1]] 
dic = {'111':outcome[0], '110':outcome[1], '101':outcome[2], '100':outcome[3], '011':outcome[4], '010':outcome[5], '001':outcome[6], '000':outcome[7]} 
X_num = str(match_M) + str(match_K) + str(match_T) 

Ich würde es vorziehen, um über Ergebnisse und cartesianischen Produkte der Mächtigkeit Sätze von [0, 1] und Index iterieren mit jeweils separaten Anpaßvariablen

>>> from itertools import product 
>>> dic = {k : v for k, v in zip(product([0,1], repeat = len(keys)), outcome)} 
>>> dic 
{(0, 1, 1): [0, 2, 1], (1, 1, 0): [2, 3, 1], (1, 0, 0): [1, 3, 1], (0, 0, 1): [0, 2, 1], (1, 0, 1): [1, 3, 2], (0, 0, 0): [0, 3, 1], (0, 1, 0): [0, 3, 2], (1, 1, 1): [3, 3, 1]} 
>>> dic[(match_M, match_K, match_T)] 
[1, 3, 2] 

ich würde sogar die Idee erweitern und entmutigen Sie separate Anpaßvariablen verwenden, sondern ein Spiel Tupel

keys = [r'something1...', r'something2...', r'something3...'] 
match = [[0, 1][re.search(key , fetch.text) != None] for key in keys] 

Zusammengefasst

def foo(url, keys, outcome): 
    from itertools import product, izip 
    fetch = fetch = requests.get(url) 
    match = [[0, 1][re.search(key , fetch.text) != None] for key in keys] 
    dic = {k : v for k, v in izip(product([0,1], repeat = len(keys)), outcome)} 
    return dic[match] 

Diese Ihnen auf der Mächtigkeit des Schlüssels skalieren helfen beschränken das Design und nicht auf der Grundlage

Hinweis ich generell lieber [0, 1][re.search(key , fetch.text) != None] aber es alternative Syntax wie 0 if re.search(key , fetch.text) == None else 1 ist gleichermaßen ermutigt

+0

Vielen Dank für die Unterstützung von Abhijit, aber für mein aktuelles Niveau, ich brauche wirklich mehr Zeit und Übung, um Ihren Code zu verstehen. Danke trotzdem! Gute Arbeit. – sam

Verwandte Themen