我正在尝试通过用户输入选择字典,然后从中选择要运行的字典中列出的功能。我的代码当前发生的情况是它将正确选择正确的字典,但是在选择函数时,在输入所需的函数ID时它将起作用,但是对于所选字典中的每个条目重复此操作。我该怎么做才能解决此问题?
定义的实际功能只是在测试/调试时打印一个随机数作为占位符。为了简化测试/调试过程,我还将这些函数保留在它们的十六进制内存位置。
calculus = {
'1': cal1,
'2': cal2,
'3': cal3,
}
physics = {
'1': phy1,
'2': phy2,
'3': phy3,
}
def Main():
a = input("Choose equation set. Calculus or Physics: ")
if a == "Calculus":
for item in (calculus.keys()):
print(item,":",calculus.get(item,'-'))
eq_id = input("Enter desired equation function id: ")
eq_arg = input("Press Enter")
calculus[eq_id](eq_arg)
elif a == "Physics":
for item in (physics.keys()):
print(item,":",physics.get(item,'-'))
ph_id = input("Enter desired equation id: ")
ph_arg = input("Press Enter")
physics[ph_id](ph_arg)
下面是输出给我的示例:(“”中的用户输入,“”中的功能名称,“””中的输出)
选择方程式集。微积分或物理:“物理”
1 :(功能phy1位于0x7f32a527c6a8)
输入所需的方程式ID:“ 1”
按Enter
'“ 347”'
2 :(功能phy2位于0x7f32a527c730)
输入所需的方程式ID:“ 3”
按Enter
'“ 540”'
3 :(在0x7f32a527c7b8处具有phy3功能)
输入所需的方程式ID:“ 2”
按Enter
'“ 429”'
但是我希望它更像这样:
选择方程式集。微积分或物理:“物理”
1:“物理1”
2:“物理2”
3:“物理3”
输入所需的方程式ID:“ 2”
'“执行所选功能”'
答案 0 :(得分:0)
您可以尝试如下操作:
def cal1():
print ("Cal1")
def cal2():
print ("Cal2")
def cal3():
print ("Cal3")
def phy1():
print ("phy1")
def phy2():
print ("phy2")
def phy3():
print ("phy3")
calculus = {
1: cal1,
2: cal2,
3: cal3,
}
physics = {
1: phy1,
2: phy2,
3: phy3,
}
def main():
a = input("Choose equation set. Calculus or Physics: ")
if a == "Calculus":
for item in calculus.keys():
print(item,":",calculus[item].__name__)
eq_id = input("Enter desired equation function id: ")
calculus[eq_id]()
elif a == "Physics":
for item in physics.keys():
print(item,":",physics[item].__name__)
ph_id = input("Enter desired equation id: ")
physics[ph_id]()
main()
输出:
Choose equation set. Calculus or Physics: "Calculus"
(1, ':', 'cal1')
(2, ':', 'cal2')
(3, ':', 'cal3')
Enter desired equation function id: 1
Cal1
答案 1 :(得分:0)
在这里您似乎想要的是一个嵌套的字典,其中的顶级键是“ Physics”和“ Calculus”,然后每个的值就是您已经指定的字典。
formulas = { "Calculus" :
{
'1': cal1,
'2': cal2,
'3': cal3,
},
"Physics" :
{
'1': phy1,
'2': phy2,
'3': phy3,
}
}
这样,您可以在同一个函数中进行所有输入。
a = input("Choose equation set. Calculus or Physics: ")
formula_set = forumlas[a]
for key in forumla_set.keys():
print("{}: {} {}".format(key, a, key)
eq_id = input("Enter desired equation function id: ")
eq_arg = input("Press Enter")
formula_set[eq_id](eq_arg)
正如所提到的评论之一,最好使字典键为小写,然后将所有输入都转换为小写。
答案 2 :(得分:0)
最简单的事情是:
calculus = {
'1': calculus_1,
'2': calculus_2,
'3': calculus_3,
}
physics = {
'1': physics_1,
'2': physics_2,
'3': physcis_3,
}
def Main():
a = input("Choose equation set. Calculus or Physics: ")
if a == "Calculus":
for item in (calculus.keys()):
# I'm using the __name__ attribute on the function handle
print(item,":",calculus.get(item,'-').__name__)
eq_id = input("Enter desired equation function id: ")
eq_arg = input("Press Enter")
calculus[eq_id](eq_arg)
elif a == "Physics":
for item in (physics.keys()):
print(item,":",physics.get(item,'-').__name__) # i'm using the __name__ attribute on the function handle
ph_id = input("Enter desired equation id: ")
ph_arg = input("Press Enter")
physics[ph_id](ph_arg)
但是我建议您将数据结构更改为以下内容;
calculus = {
'1': {
'func_name': 'calculus 1',
'func': calculus_1 # where calculus_1 is the function handle
},
'2': {
'func_name': 'calculus 2',
'func': calculus_2 # where calculus_2 is the function handle
},
'3': {
'func_name': 'calculus 3',
'func': calculus_3 # where calculus_3 is the function handle
}
}
并通过类似的方式访问它,
for item in (calculus.keys()):
print(item,":",calculus.get(item,'-')['func_name'])
...
calculus[eq_id]['func'](eq_arg)
答案 3 :(得分:0)
添加具有函数名称的嵌套字典:
calculus = {
'1': {'Name': 'Calculus 1', 'Function': cal1},
'2': {'Name': 'Calculus 2', 'Function': cal2},
'3': {'Name': 'Calculus 3', 'Function': cal3}
}
然后修改您的循环:
for key, item in calculus.items():
print(key,":", item.get('Name'))
eq_id = input("Enter desired equation function id: ")
# eq_arg = input("Press Enter") # <--- (You don't need this)
calculus.get(key).get('Function')()
您也可以使用嵌套的list
而不是['Calculus 1', cal1]
,但是可能很难分辨calculus['1'][0]
是名称,calculus['1'][1]
是函数。
如果您所关心的只是一个通用函数名,它会根据其出现的顺序递增,那么它就更简单了:
for item in (calculus.keys()):
print(item,":", 'Calculus {}'.format(item)))
eq_id = input("Enter desired equation function id: ")
calculus.get(eq_id)()