如何替换python中的许多if…elif语句?

How to replace many 'if…elif' statements in Python?

本问题已经有最佳答案,请猛点这里访问。

我用python编写了一些代码,其中有很多if..elif语句。我知道代码样式可能被认为是坏的,我想改进它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
num = int(input('please input a number: '))

if num <= 0:
    print('1')
elif 0 < num <= 5:
    print('2')
elif 5 < num <= 10:
    print('3')
elif 10 < num <= 15:
    print('4')
elif 15 < num <= 20:
    print('5')
elif 20 < num <= 25:
    print('6')

我想知道如何用其他解决方案替换这么多"if..elif"语句?


你可以这样做:

1
print(((num - 1) // 5) + 2)

例如,当num为20时:

1
2
3
4
5
((num - 1) // 5) + 2
((20 - 1) // 5) + 2
(19 // 5) + 2
3 + 2
5

一般来说…不确定。如果你说的是一个完全武断的if-elif-else结构,那么我会说不,至少在某种程度上不会有助于可读性。事实上,我刚才为您的具体示例给出的答案甚至可能对可读性没有帮助,所以我不确定在一般情况下您对它的期望有多高。


您可以通过删除每个条件的两个<检查中的一个来稍微缩短代码,就像这样。

1
2
3
4
5
6
7
8
num=int(input('please input a number: '))

if num<=0:
    print('1')
elif num<=5:
    print('2')
elif num<=10:
    print('3')


对分图书馆也可以在这种情况下使用,而且也非常有效。文档给出了考试成绩边界的使用示例。如果使用非线性边界,这种方法将使其更加灵活。

1
2
3
4
5
6
7
8
import bisect

def boundaries(num, breakpoints=[0, 5, 10, 15, 20, 25], result='1234567'):
    i = bisect.bisect(breakpoints, num-1)
    return result[i]

num = int(input('please input a number: '))
print(boundaries(num))

注意,这只在Python2.7中进行了测试。


1
2
3
4
num = int(input('please input a number: '))

if num < 26:
    print(1 + len([i for i in [0, 5, 10, 15, 20, 25] if i < num]))

对于类似这样的简单示例,在不同的情况下适合一个清晰的模式,最好的方法是像redrobohood建议的那样,完全删除条件(稍微修改以支持下界),例如。

1
print('%s' % max((num - 1) // 5 + 2, 1))

如果您希望稍微更一般一些,并且允许不遵循输入模式的print语句,那么可以使用python字典:

1
2
3
4
5
# what to print if num is less than the number but greater than the previous
mapping = {0:'1', 5:'2', 10:'3', 15:'4', 20:'5', 25:'6'}
# clamp the number to the upper bound of the desired range
clamped_num = 5 * max((num - 1) // 5, -1) + 5
print(mapping[clamped_num] if clamped_num in mapping else 'Bad value')

然而,总有一些时候你不能像这样把它简单化,对于那些我认为如果其他的说法是好的。


这是另一种方法:

1
2
3
4
5
a = { '1': (range(1,6)), '2': (range(6,11)), '3': (range(11,16)), '4':(range(16,21)), '5':(range(21,26))}
num=int(input('please input a number: '))
b = {k:v for k,v in a.items() if num in v}
c = b.keys()
print c[0]

在python3 print(c[0])