变量+ =%可能或如何获得另一个数字之后的数字的下一个间隔

时间:2012-12-05 14:40:57

标签: python math range modulo

我希望能够做类似以下的事情......

说我想要一个100-500的每个数字的列表,它是33的倍数。

>>> a = 100
>>> b = 500
>>> range(a,b,33)
[100, 133, 166, 199, 232, 265, 298, 331, 364, 397, 430, 463, 496]

这不是我想要的,这是因为a不是33的倍数。

要从a获取33的下一个倍数,我可以这样做:

a = a - a % 33 + 33

我想知道是否有更简单的方法来做到这一点,如果我想在不知道实际值的情况下创建这个范围而不必事先定义它们。

如:

>>> def multiple(a, b, c):
    return range(a+=%c, b, c) #if this was possible

显然它会返回一个正确的范围,例如:

>>> multiple(100, 500, 33)
[132, 165, 198, 231, 264, 297, 330, 363, 396, 429, 462, 495]

我知道我可以做一些简单的事情:

range(a - a%c + c, b, c)

然而,在没有详细说明的情况下,在我的情况下调用a的值对我来说是昂贵的,而且我希望能够找到一种不必再次调用它的方法,而且上面的方法真的不太好看。

我真的不确定我的问题的标题应该是什么,但我想我正在寻找的是一种方法,可以在另一个给定数字之后找到下一个数字的倍数。

谢谢。

2 个答案:

答案 0 :(得分:3)

以下是您想要的,只使用a一次:

In [4]: range((a + c - 1) // c * c, b + 1, c)
Out[4]: [132, 165, 198, 231, 264, 297, 330, 363, 396, 429, 462, 495]

我仍然会将它放入辅助函数中,因此无法使用a次的问题。

与您问题中的代码不同,这实际上适用于a可被c整除的情况。此外,与您问题中的代码不同,它在范围内包含b(根据您在评论中对我的问题的回答,应该如此):

In [15]: range((a + c - 1) // c * c, b + 1, c)
Out[15]: [66, 99, 132]

答案 1 :(得分:0)

好吧,要每次获得33的倍数,您只需要从multiple of 33开始。

因此,请在33之后的100的第一个倍数开始,因为range函数将继续添加33以获得下一个倍数。

要获得33之后num的第一个倍数,您可以使用: -

num / 33 * 33 + 33  <==>  (num / 33 + 1) * 33

因此,对于您的范围,您可以使用: -

>>> a = 100
>>> b = 500
>>> a = (a / 33 + 1) * 33
>>> range(a, b, 33)
[132, 165, 198, 231, 264, 297, 330, 363, 396, 429, 462, 495]