首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python开关/带条件的case

python开关/带条件的case
EN

Stack Overflow用户
提问于 2018-06-16 04:25:03
回答 1查看 82关注 0票数 -4

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

代码语言:javascript
复制
def switch(case):
    return {
        "a":fa,
        "b":fb,
    }.get(case, f_default)

但我希望这个案例满足以下某些条件:

代码语言:javascript
复制
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)()

我的想法是,字典中的return键是任何为真的东西。这就是我写magnitude == True的原因。有人能给我一些指导吗,我的想法在magnitude == True中,但是没有它,就会像预期的那样出现KeyValue错误。

EN

回答 1

Stack Overflow用户

发布于 2018-06-16 04:52:40

看起来您想要在排序列表中搜索元素之间插入新值的位置。幸运的是,python已经包含了使用非常高效的二分法的bisect模块,该算法将列表分成两部分,直到找到正确的值:

代码语言:javascript
复制
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,))]

用法:

代码语言:javascript
复制
>>> descriptor(4.4)
(5.0, 'Light')
>>> descriptor(7.2)
(8.0, 'Major')
>>> descriptor(3.0)
(3.0, 'Very Minor')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50882225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档