请原谅一个新手问题,但我在代码中有以下代码段:
timePeriod = '7'
timeDiff = today - dateLast
if timeDiff.days > 90:
timePeriod = '180'
elif timeDiff.days > 30:
timePeriod = '90'
elif timeDiff.days > 7:
timePeriod = '30'
# Use timePeriod in call...
它看起来非常低效。必须有一个更好的方法来使用datetime库分配timePeriod,但我还没有找到。部分问题在于代码非常通用,搜索答案会产生数千个不相关的结果。我已经考虑过了:
timePeriod = '180' if timeDiff.days > 90 else '90' if timeDiff.days > 30 else...
但这并没有利用我在其他地方看到过的python的力量。
这里有没有明显的“正确”解决方案,我没有看到?或者我的原始解决方案“足够好”,我不应该搞乱它?
非常感谢!
答案 0 :(得分:1)
向J.F.塞巴斯蒂安提示,他向我指出了这个方向。对于那些对解决方案感兴趣的人,我选择了:
from bisect import bisect
...
periods = [0, 7, 30, 90, 180]
timeDiff = (today - dateLast).days
timePeriod = str(periods[bisect(periods[:-1], timeDiff)])
对timeDiff的所有正值进行测试([: - 1]将结果限制为'180',防止超出范围参考。
答案 1 :(得分:0)
如果你想要“漂亮”的代码,你可以做这样的事情(一般来说,这个想法是将你的条件组合成某种你可以迭代的数据结构)
timeDiff = (today - dateLast).days
timePeriod = next(p for p, expr in (('180', timeDiff > 90),
('90', timeDiff > 30),
('30', timeDiff > 7),
('7', True))
if expr)
# Use timePeriod in call...
这可能是也可能不会过度。
答案 2 :(得分:0)
你可以使用元组。其中tup [0]代表timeDiff
天,而tup [1]代表timePeriod
代表。{/ p>
tup = ( (90, 180), (30, 90), (7, 30) )
for t in tup:
if timeDiff.days > tup[0]:
timePeriod = tup[1]
break
它会小很多但我不确定效率。