如何处理Python开关/带条件的情况?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (89)

if-else语句很麻烦。 我想在Python中构造一个switch / case语句。 但Python中的switch / case语句适用于特定情况,例如:

def switch(case):
    return {
        "a":fa,
        "b":fb,
    }.get(case, f_default)

但我希望案件符合以下条件:

def descriptor(magnitude):
    return {
        magnitude == 10.0: 'Meteoric',
        magnitude >= 9.0: 'Great',
        magnitude >= 8.0: 'Major',
        magnitude >= 7.0: 'Strong',
        magnitude >= 6.0: 'Moderate',
        magnitude >= 5.0: 'Light',
        magnitude >= 4.0: 'Minor',
        magnitude >= 3.0: 'Very Minor',
        magnitude <= 2.0: 'Micro'
}.get(magnitude, magnitude == True)()

我的想法是,字典中的返回键是正确的,magnitude == True。有人能给我指点吗,我的想法是magnitude == True如果没有它,就会出现预期的KeyValue错误。

提问于
用户回答回答于

看起来,你想要搜索排序列表,以确定元素之间插入新值的位置。python已经包含了使用非常有效的二分算法来完成的bisect模块,该算法将列表分成两部分,直到找到正确的值为止:

import bisect
l = sorted([
    (10.0, 'Meteoric'),
    (9.0, 'Great'),
    (8.0, 'Major'),
    (7.0, 'Strong'),
    (6.0, 'Moderate'),
    (5.0, 'Light'),
    (4.0, 'Minor'),
    (3.0, 'Very Minor'),
    (2.0, 'Micro'),
])

def descriptor(magnitude):
    return l[bisect.bisect_left(l, (magnitude,))]

代码如下:

>>> descriptor(4.4)
(5.0, 'Light')
>>> descriptor(7.2)
(8.0, 'Major')
>>> descriptor(3.0)
(3.0, 'Very Minor')

扫码关注云+社区

领取腾讯云代金券