如何在python中应用switch case根据变量';s值
我可以在下面的场景中使用switch case替代方案吗 如果如何在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,
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,但说了另一个。我想该睡觉了。:)可能是重复的