python确定时间范围的最佳方法

时间:2014-03-06 22:58:41

标签: python datetime python-2.7 range

请原谅一个新手问题,但我在代码中有以下代码段:

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的力量。

这里有没有明显的“正确”解决方案,我没有看到?或者我的原始解决方案“足够好”,我不应该搞乱它?

非常感谢!

3 个答案:

答案 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

它会小很多但我不确定效率。