2013-11-02 48 views
1

如何將範圍(n,n + 2000)劃分爲大小爲j的塊。 輸出應該看起來像[0,500],[500,1000],[1000,1500],[1500,2000]。 但是,如果範圍(n,n + 7864),那麼我們如何將它們分成幾乎相同大小的塊。將範圍(n,n + 2000)劃分爲大小爲j的塊。

試圖代碼:

for a in range(1,500): 
    if (last<500): 
     last=a+500 list.append([a,last]); 
     a=last; 
    elif(last>500): 
     list.append([list[len(list)-2][1],last element]) 
+0

是什麼修正:塊的大小還是塊的數量? –

+1

你能告訴我們你的企圖嗎? – aIKid

+0

大小是固定的,例如j = 500。 – mparida

回答

4

簡單易懂的使用zip

def range_sequence(start, stop, step): 
    return zip(range(start, stop, step), range(start+step, stop+step, step)) 

結果:

In [4]: list(range_sequence(0, 2000, 500)) 
Out[4]: [(0, 500), (500, 1000), (1000, 1500), (1500, 2000)] 

注意,這可能包括在最後一個不必要的元素:

In [5]: list(range_sequence(0, 7864, 500)) 
Out[5]: 
[(0, 500), 
(500, 1000), 
(1000, 1500), 
(1500, 2000), 
(2000, 2500), 
(2500, 3000), 
(3000, 3500), 
(3500, 4000), 
(4000, 4500), 
(4500, 5000), 
(5000, 5500), 
(5500, 6000), 
(6000, 6500), 
(6500, 7000), 
(7000, 7500), 
(7500, 8000)] 

(7500, 8000)對可能不是你想要的。如果您只想在(7000, 7500)處停留,則可以將stop+step更改爲stop。 如果最後一對應該是(7500, 7864)那麼你必須做一些更COMPEX:

def range_sequence(start, stop, step): 
    result = list(zip(range(start, stop, step), range(start+step, stop, step)) 
    if (stop - start) % step != 0: 
     last_fst_elem = result[-1][-1] if result else start 
     result.append((last_fst_elem, stop)) 
    return result 

結果:

In [15]: range_sequence(0, 7864, 500) 
Out[15]: 
[(0, 500), 
(500, 1000), 
(1000, 1500), 
(1500, 2000), 
(2000, 2500), 
(2500, 3000), 
(3000, 3500), 
(3500, 4000), 
(4000, 4500), 
(4500, 5000), 
(5000, 5500), 
(5500, 6000), 
(6000, 6500), 
(6500, 7000), 
(7000, 7500), 
(7500, 7864)] 
+0

真棒解決方案。 – aIKid

+0

@mparida我已經更新了我的回答,以考慮到這一點。 – Bakuriu

1

可以使用發電機功能:

>>> import math 
def solve(start, end, sep): 
    prev = start 
    for _ in xrange(int(math.ceil((end-start)/float(sep)))): 
     _next = prev + sep 
     yield [prev, min(_next, end)] 
     prev = _next 
...   
>>> list(solve(0, 7864, 500)) 
[[0, 500], [500, 1000], [1000, 1500], [1500, 2000], [2000, 2500], [2500, 3000], [3000, 3500], [3500, 4000], [4000, 4500], [4500, 5000], [5000, 5500], [5500, 6000], [6000, 6500], [6500, 7000], [7000, 7500], [7500, 7864]] 
>>> list(solve(0, 2000, 500)) 
[[0, 500], [500, 1000], [1000, 1500], [1500, 2000]] 
>>> list(solve(0, 1710, 500)) 
[[0, 500], [500, 1000], [1000, 1500], [1500, 1710]] 
+1

'下一個如果下一個<=結束其他結束'可能被寫爲'min(next,end)'(這取決於口味,可能更具可讀性)。此外,我會避免使用標識符「下一個」,因爲它是自python2.6以來的內置函數。改用'next_'或'next_elem'。 – Bakuriu

+0

@Bakuriu好點,更新瞭解決方案。 –