Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中应用switch case根据变量';s值_Python_Python 2.7 - Fatal编程技术网

如何在python中应用switch case根据变量';s值

如何在python中应用switch case根据变量';s值,python,python-2.7,Python,Python 2.7,我可以在下面的场景中使用switch case替代方案吗 如果x是5、6、7、8中的任何一个,我想返回0, 如果x是9、10、11、12中的任何一个,我想返回1, 如果x是13、14、15、16中的任意一个,我想返回2, 如果x是17、18、19、20中的任意一个,我想返回3 对于单值,我遇到了类似的情况,但不确定如何在上述场景中使用类似的语法 def group(x): return { [5, 6, 7, 8]: 0, [9, 10, 11, 12]: 1, [13, 14,

我可以在下面的场景中使用switch case替代方案吗

如果
x
5、6、7、8
中的任何一个,我想返回
0
, 如果
x
9、10、11、12
中的任何一个,我想返回
1
, 如果
x
13、14、15、16
中的任意一个,我想返回
2
, 如果
x
17、18、19、20
中的任意一个,我想返回
3

对于单值,我遇到了类似的情况,但不确定如何在上述场景中使用类似的语法

def group(x):
 return {
  [5, 6, 7, 8]: 0,
  [9, 10, 11, 12]: 1,
  [13, 14, 15, 16]: 2,
  [17, 18, 19, 20]: 3,
  }.get(x, "Invalid")

有人能帮我总结一下,我是可以使用上述方法,还是只能选择其他方法?

列表不能用作字典键。为每个键创建单独的字典项:

return {5: 0, 6: 0, 7: 0, 8: 0, 9: 1, ..., 12: 1, ...}.get(x, "Invalid")

您可以使用元组作为字典的键,然后使用生成器获取值,或者如果数字不在任何键中,则返回
“无效”
,例如:

def group(x):
    d = {(5, 6, 7, 8): 0, (9, 10, 11, 12): 1, (13, 14, 15, 16): 2, (17, 18, 19, 20): 3}
    return next((d[i] for i in d if x in i), 'Invalid')

print group(11)
print group(17)
next()
将找到下一个包含
x
的键并返回值

输出:

1
3

你可以用算术来解决这个问题

def group(x):
    """5-8   -> 0
       9-12  -> 1
       13-16 -> 2
       17-20 -> 3
    """
    # scale down our starting values, so 5-8 -> 0-3
    return (x-5) // 4
如果您想为任意分组->返回值对找到一个通用的解决方案,您需要编写一个函数工厂

def selector(groups, return_values, fallback=None):
    if len(groups) != len(return_values):
        raise ValueError("groups and return_values must have equal length")
    def wrapped(needle):
        nonlocal groups, return_values, fallback
        for grp, retval in zip(groups, return_values):
            if needle in grp:
                return retval
        # if no matches
        return fallback
    return wrapped
然后你可以做:

group = selector([(5, 6, 7, 8), (9, 10, 11, 12),
                  (13, 14, 15, 16), (17, 18, 19, 20)],
                 [0, 1, 2, 3],
                 fallback="Invalid")
group(3)

我想避免这种情况,所以如果有我没有想到的替代方法…@DYZ如果你忽略算术解,是的;)@AdamSmith算术解对于这些特定的数字是非常具体的。这是最好的解决方案,因为它尊重dict的使用,并且有效,因为范围(似乎是)你应该认真地考虑这是你的问题的最佳解决方案。在大多数情况下,它不是很重要,但是你应该使用密钥集而不是元组:<代码> d={ { 5, 6, 7,8 }:0,{ 9, 10, 11,12 }:1,…/代码>。这将给你O(1)查找与O(n)的关系。.请看这里:但是集合怎么可能是字典键,不是
set
unhable类型。@Bijoy可以使用
frozenset
s:
d={frozenset({5,6,7,8}):0…}
@Bijoy是的,正常的密码是不易损坏的,因此不能用作字典的钥匙是的,我的错。我想是
冻结密码
s,但说了另一个。我想该睡觉了。:)可能是重复的