我有这个代码,我想把它扩展到一个非常高的数量,但是我的方式非常低效...也许这里有一个人知道一个简单的方法来缩短它。
http://jenkins.example.com/git/notifyCommit?url=<repo-url>
答案 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
模块的另一个使用示例。