python开关/有条件的情况

时间:2018-06-15 20:25:03

标签: python function dictionary switch-statement

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错误。

1 个答案:

答案 0 :(得分:1)

您希望在排序列表中搜索要插入新值的元素之间的位置。幸运的是,python已经包含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')

用法:

URL