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