1

我希望能够执行以下操作...

假设我想要一个 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 的倍数。

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

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在我的情况下调用 的值对我来说是昂贵的,我希望能够找到一种不必再次调用它的方法,而且上述方法真的不好看一点也不。

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

谢谢你。

4

2 回答 2

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]
于 2012-12-05T14:45:25.083 回答
0

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

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

33要获得number 之后的第一个倍数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]
于 2012-12-05T14:54:35.120 回答