2016-11-24 1 views
1

Der folgende Code ist ein Beispiel für ein Community-Projekt, das ich durchlebe.Alternative Technik zu Python "Wenn ... elif ... else", um über 1.500 Optionen zu loopen

cat1 = 'Engr, Bricklayer, Attendant' 
cat2 = 'Programmer, Artist, Engr, Servant' 
cat3 = 'Programmer, Typist' 


amount = float(input("Enter amount: ")) 

choice = input("Select Beneficiary: ") 


print("-----------------------------------") 

if choice == cat1: 
    print("Name: Engr\nShare: 1/6 (1 cikin 6)\nBenefits: N" + str((amount/6) * 1)) 
    print("-----------------------------------") 
    print("Name: Bricklayer\nShare: 1/2 (3 cikin 6)\nBenefits: N" + str((amount/6) * 3)) 
    print("-----------------------------------") 
    print("Name: Attendant\nShare: 1/3 (2 ciin 6)\nBenefits: N" + str((amount/6) * 2)) 
    print("-----------------------------------") 
    print("Jimilla: N" + str(sum([(amount/6) * 1, (amount/6) * 3, (amount/6) * 2]))) 

elif choice == cat2: 
    print("Name: Programmer\nShare: 1/8 (3 cikin 24)\nBenefits: N" + str((amount/24) * 3)) 
    print("-----------------------------------") 
    print("Name: Artist\nShare: 1/6 (4 cikin 24)\nBenefits: N" + str((amount/24) * 4)) 
    print("-----------------------------------") 
    print("Name: Engr\nShare: 1/6 (4 cikin 24)\nBenefits: N" + str((amount/24) * 4)) 
    print("-----------------------------------") 
    print("Name: Servant\nShare: Ragowa (13 cikin 24)\nBenefits: N" + str((amount/24) * 13)) 
    print("-----------------------------------") 
    print("Jimilla: N" + str(sum([(amount/24)*3,(amount/24)*4,(amount/24)*4,(amount/24)*13]))) 

Im Folgenden finden Sie die Ausgabe nach Werten aus dem Benutzer zu empfangen:

Enter amount: 2540000 
Select Beneficiary: Engr, Bricklayer, Attendant 
----------------------------------- 
Name: Engr 
Share: 1/6 (1 cikin 6) 
Benefits: N423333.3333333333 
----------------------------------- 
Name: Bricklayer 
Share: 1/2 (3 cikin 6) 
Benefits: N1270000.0 
----------------------------------- 
Name: Attendant 
Share: 1/3 (2 ciin 6) 
Benefits: N846666.6666666666 
----------------------------------- 
Jimilla: N2540000.0 
>>> 

Wie Sie sehen können, habe ich die Wenn bin mit ... elif ... else Steueranweisungen durch die Elemente bewegen in den Kategorien, die oben im Code definiert sind. Ich muss etwa 1.500 verschiedene Kategorien mit einer Kombination von verschiedenen Elementen/Begünstigten schaffen, die zu verschiedenen Anteilen berechtigt sind. Gibt es irgendeine Technik, die ich verwenden kann, um die Optionen zu durchlaufen, anstatt If ... elif ... sonst zu verwenden?

Ich bin neu in Python. Die Ausgabe des obigen Codes ist was ich will, aber mit dem If ... elif ... sonst, um die Benutzereingaben gegen die 1500 Kategorien zu überprüfen, wird ein bisschen monoton oder eher, hektisch.

Ich brauche deine Hilfe, bitte.

+0

Wörterbuch ist eine gute Option. Und machen Sie Ihre Druckwerte einzigartig und machen Sie sie zu einer Funktion. –

+0

Könnte http://stackoverflow.com/questions/60208/replacements-for-switch-statement-in-python hilfreich sein? – fredtantini

+0

Erstellen Sie ein Funktionsverzeichnis, und konstruieren Sie die zu druckenden Zeichenfolgen. –

Antwort

1

Erstens könnten Sie alle Ihre Empfänger als CSV-Datei im Format kodieren

[Begünstigter, Numerator, Dinominator]

wie unten

category.csv Inhalte gezeigt:

Engr, 1, 6 
Bricklayer, 3, 6 
Attendant, 2, 6 
Programmer, 3, 24 
Artist, 4, 24 
Engr, 4, 24 
Servant, 13, 24 

Dann konvertieren Sie die Daten in ein Wörterbuch und manipulieren Sie entsprechend. Der folgende Code gibt eine ähnliche Ausgabe wie Ihre.

import csv 

beneMap = {} 

with open("category.csv") as f: 
    csvFile = csv.reader(f) 
    for row in csvFile: 
     beneMap[row[0]] = (row[1], row[2]) 

def getJimilla(beneMap, benef, amount): 
    benList = benef.split(', ') 
    jimilla = 0 
    for name in benList: 
     ben = beneMap[name] 
     jtemp = amount*int(ben[0])/int(ben[1]) 
     print("Name: "+name 
       +"\nShare: "+ben[0]+"/"+ben[1]+" ("+ben[0]+" cikin "+ben[1]+")" 
       +"\nBenefits: N" + str(round(jtemp,2)) 
       +"\n-----------------------------------") 
     jimilla += jtemp 
    print("Jimilla: N"+str(round(jimilla,2))) 

amount = float(input("Enter amount: ")) 
choice = input("Select Beneficiary: ") 

print("-----------------------------------") 

getJimilla(beneMap, choice, amount) 

Probelauf:

Enter amount: 2540000 
Select Beneficiary: Engr, Bricklayer, Attendant 
----------------------------------- 
Name: Engr 
Share: 4/ 24 (4 cikin 24) 
Benefits: N423333.33 
----------------------------------- 
Name: Bricklayer 
Share: 3/ 6 (3 cikin 6) 
Benefits: N1270000.0 
----------------------------------- 
Name: Attendant 
Share: 2/ 6 (2 cikin 6) 
Benefits: N846666.67 
----------------------------------- 
Jimilla: N2540000.0 

Beachten Sie, dass die Kategorie verstanden wird, wenn die Eingangssequenz gegeben wird, so dass keine zusätzliche Informationen benötigen in der CSV-Datei in Bezug auf die Kategorie des Begünstigten getragen werden.

+0

Ich würde die _int_ Konvertierung in die _beneMap_ Füllung verschieben und String-Formap für das Drucken verwenden ... – Copperfield

+0

Sie haben Recht, @Copperfield. Ich dachte zunächst an das Gleiche, wie es technisch gesehen das Richtige ist, um die Semantik zu bewahren. Allerdings habe ich es als String gelassen, um die Code-Länge zu reduzieren, wie es das OP möchte. Andernfalls würden Sie viel mehr 'str()' Konvertierungen sehen. –

+0

Vielen Dank @EbeIsaac. Genau das wollte ich. Bei der tatsächlichen Durchführung haben die Begünstigten jedoch unterschiedliche Anteile. Zum Beispiel kann ein Begünstigter 1/2, 2/3, 1/6 haben, abhängig von der Kombination der ausgewählten Begünstigten. Wenn Programmer und Attendant ausgewählt sind, wird der Anteil des Programmierers 3/6, der des Künstlers 2/6. Jedoch kann der Programmierer, wenn er allein ist, den gesamten Anteil usw. übernehmen. Es kann auch einen Fall geben, in dem ein Begünstigter die Mahnung mit einigen anderen Begünstigten teilen kann. Ich schätze Ihren Beitrag sehr. Bin dankbar! – shallowGeek

Verwandte Themen