有没有办法选择一个词典,然后从该词典中选择一个功能?

时间:2019-01-31 17:49:06

标签: python dictionary

我正在尝试通过用户输入选择字典,然后从中选择要运行的字典中列出的功能。我的代码当前发生的情况是它将正确选择正确的字典,但是在选择函数时,在输入所需的函数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”
'“执行所选功能”'

4 个答案:

答案 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)()