缩短Python中的许多if子句

时间:2015-11-15 21:42:35

标签: python

我有这个代码,我想把它扩展到一个非常高的数量,但是我的方式非常低效...也许这里有一个人知道一个简单的方法来缩短它。

http://jenkins.example.com/git/notifyCommit?url=<repo-url>

3 个答案:

答案 0 :(得分:4)

怎么样:

space_x = 10**int(math.log10((draw_x+draw_x1)//5))

答案 1 :(得分:0)

您可以使用OrderedDict

from collections import OrderedDict

od = OrderedDict([
    (50, 10),
    (500, 100),
    (5000, 1000),
])

for border, value in od:
    if draw_x + draw_x1 > border:
        space_x = value

如果你测试<=并且中断,你可以加快这个过程 匹配后(或在函数内返回):

od = OrderedDict([
    (5, 10),
    (50, 100),
    (500, 1000),
])

for border, value in od:
    if draw_x + draw_x1 <= border:
        space_x = value
        break

如果你的问题确实是这个映射,你可以简单地使用公式来计算space_x变量:

import numpy as np
space_x = 10 ** np.log10((draw_x + draw_x1) // 5)

答案 2 :(得分:0)

如果您的映射无法用代数表示,您可以使用bisect()执行此操作,比公式提供的更灵活(您可以说要扩展您的示例)。

from bisect import bisect_left

thresholds = [50, 500, 5000, 50000, 500000, 5000000]
spaces = [0, 10, 100, 1000, 10000, 100000, 1000000]
space_x = spaces[bisect_left(thresholds, draw_x+draw_x1)]

一些例子:

>>> spaces[bisect_left(thresholds, 49)]
0
>>> spaces[bisect_left(thresholds, 50)]
0
>>> spaces[bisect_left(thresholds, 51)]
10
>>> spaces[bisect_left(thresholds, 50.01)]
10
>>> spaces[bisect_left(thresholds, 500)]
10
>>> spaces[bisect_left(thresholds, 501)]
100
>>> spaces[bisect_left(thresholds, 5000000)]
100000
>>> spaces[bisect_left(thresholds, 5000001)]
1000000
>>> spaces[bisect_left(thresholds, 123456789)]
1000000

现在很容易将映射扩展到没有代数关系的值。您可以在documentation中看到bisect模块的另一个使用示例。