2012-12-05 16 views
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值對我來說貴於我而言,我希望能夠找到一種方法,沒有把它稱爲第二次,也上面的方法真的不好看。

我真的不知道我的問題的標題應該是什麼,但我想我正在尋找的是一種方法來查找下一個數字的下一個倍數後的另一個給定的數字。

謝謝。

+1

應該是什麼的結果'多(66,132,33)'? – NPE

+0

@NPE很好的問題,它應該是[66,99,132] –

+0

爲什麼不簡單地存儲一個變量,所以你可以使用它兩次沒有加載它兩次? – jcr

回答

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] 
+0

這看起來也很浪費。你能告訴我這裏究竟發生了什麼? –

+0

@InbarRose:如果我是你的鞋子,我會首先關注正確性,然後再關注性能。在你的問題中'range()'調用中至少有兩個錯誤。也就是說,當我在a = 100 b = 500 c = 33時計算我的解答時,它需要800ns。你是說這樣的速度不夠快嗎? – NPE

+0

謝謝NPE。你已經幫助我解決了這個問題,並且理解了我實際上首先要找的是什麼。在後見之明後,我會提出一個完全不同的問題。儘管如此,你仍然設法回答,再次感謝。 (並且爲了更直接地回答你的問題,我的代碼現在簡單地使用一個幫助函數來獲取a,b,c並使用你的範圍建議。 –

0

好了,讓33每次的多,你只需要從multiple of 33開始。

所以,從之後的33開始,因爲range函數會繼續加上33得到下一個倍數。

要在數字num後得到的33第一多,你可以使用: -

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] 
相關問題