【问题标题】:Same output for diferent value on switch statement in pythonpython中switch语句的不同值的相同输出
【发布时间】:2020-12-28 05:15:52
【问题描述】:

所以我在 phyton 中有这段代码,我想这样做,如果输入为 -1,则返回也将是字符串“零”

def IntToStr(argument): 
    switcher = {0: "zero", 
                1: "one", 
                2: "two"} 

   return switcher.get(argument, "nothing")

所以我想知道是否有任何方法可以做类似的事情:

switcher = { 
        0 or -1: "zero", 
        1: "one", 
        2: "two", 
    } 

【问题讨论】:

  • 我确实尝试了第二个字典,调用 switcher[-1] 可以完美地返回“零”。但是,我不知道为什么 switcher[0] 会出现关键错误。

标签: python switch-statement


【解决方案1】:

您可以做的是使用 defaultdict(来自集合)并将键表示为您在最终切换器内容中展开的元组。这样您就不必重复公共键的值。您也不需要在任何地方重复默认值 .get():

switcher = {(0,-1): "zero", 
            (1,)  : "one", 
            (2,)  : "two"}

from collections import defaultdict
switcher = defaultdict(lambda:"nothing",
           { k:v for ks,v in switcher.items() for k in ks })

switcher[-1] # 'zero'
switcher[0]  # 'zero'
switcher[1]  # 'one'
switcher[5]  # 'nothing'

您可以通过创建一个函数来概括这一点,该函数将为您的任何切换字典执行元组扩展:

from collections import defaultdict
def switch(d,default=None):
    return defaultdict(lambda:default,
           { k:v for ks,v in d.items() for k in ks })

switcher = switch({ (0,-1): "zero", 
                      (1,): "one", 
                      (2,): "two"},
                 default  = "nothing")

如果您正在寻找的是模拟 switch/case 语句的行为,您可以创建一个在一次性 for 循环中使用的函数:

def switch(value): yield lambda *match: value in match

用法:

x = -1
for case in switch(x):
    if   case(-1,0) : r = "zero"
    elif case(1)    : r = "one"
    elif case(2)    : r = "two"
    else            : r = "nothing"
print(r) # zero

【讨论】:

    【解决方案2】:

    您可以添加一个额外的密钥:

    def IntToStr(argument): 
        switcher = {0: "zero", 
                   -1: "zero",
                    1: "one", 
                    2: "two"} 
    
       return switcher.get(argument, "nothing")
    

    或者你可以在函数的开头添加一个额外的行:

    def IntToStr(argument): 
        argument = 0 if argument == -1 else argument
        switcher = {0: "zero", 
                    1: "one", 
                    2: "two"} 
    
       return switcher.get(argument, "nothing")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      相关资源
      最近更新 更多