2016-11-24 1 views
1

Ниже приведен пример кода проекта сообщества, который я претерпеваю.Альтернативная техника для Python «Если ... elif ... else», чтобы перебрать более 1500 опций

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]))) 

Ниже выводится после получения значений от пользователя:

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 
>>> 

Как вы можете видеть, я использую, если ... Элиф ... ELSE оператор управления для перемещения по элементам в категориях, определенных в верхней части кода. Я должен создать около 1500 различных категорий с комбинацией различных элементов/бенефициаров, имеющих право на разные акции. Есть ли какой-либо метод, который я могу использовать для циклического использования опций вместо использования If ... elif ... else?

Я новичок в Python. Вывод кода выше - это то, что я хочу, но используя If ... elif ... else, чтобы проверить ввод пользователя в отношении 1500 категорий, будет немного однообразным или, скорее, беспокойным.

Мне нужна ваша помощь, пожалуйста.

+0

словарь - хороший вариант. И сделайте уникальность в своих значениях печати и сделайте ее формой функции. –

+0

Может ли http://stackoverflow.com/questions/60208/replacements-for-switch-statement-in-python быть полезным? – fredtantini

+0

Создайте словарь функций, создавая строки для печати. –

ответ

1

Во-первых, вы могли бы кодировать все ваши получателей в виде файла CSV в формате

[Бенефициар, Числитель, Dinominator]

, как показано ниже

category.csv содержание:

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

Затем преобразуйте данные в словарь и выполните соответствующие манипуляции. Следующий код предоставит вам аналогичный результат.

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) 

Пример запуска:

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 

Обратите внимание, что категория понимается, когда входная последовательность задается таким образом никакой дополнительной информации не должны производиться в файле CSV относительно категории получателя.

+0

Я бы переместил _int_ преобразование в заполнение _beneMap_ и использовал строчный формат для печати ... – Copperfield

+0

Вы правы, @Copperfield. Первоначально я думал о том же, что и технически правильно, чтобы сохранить семантику. Тем не менее, я оставил его в виде строки, чтобы сосредоточиться на сокращении длины кода, как того требует OP. В противном случае вы увидите гораздо больше преобразований 'str()'. –

+0

Большое спасибо @ ÉbeIsaac. Это именно то, чего я хотел. Хотя в реальной реализации бенефициары имеют разные доли. Например, один бенефициар может иметь 1/2, 2/3, 1/6, в зависимости от выбранной комбинации бенефициаров. Например, если выбран Programmer и Attendant, доля Programmer будет 3/6, а у Artist 2/6. Однако, если только один, Программист может взять всю долю и т. Д. Также может быть случай, когда бенефициар может поделиться напоминанием с некоторыми другими бенефициарами. Я очень ценю ваш вклад. Благодарю! – shallowGeek

Смежные вопросы