2017-03-04 4 views
0

Angenommen, ich habe eine ganze Zahl n und ich brauche es in k -sized Bereiche zu unterteilen, so dass das Ergebnis ist eine Liste von Tupeln wie folgt aus:Partition integer in Bereiche

[(0, k - 1), (k, 2*k - 1), ...] 

Wie kann ich dies tun elegant in Python? Ich bin nicht fragt, wie man hier eine Liste partitioniert, ich frage, wie man eine ganze Zahl partitioniert, und nur die Anfangs- und letzten Indizes der Bereiche in einer Liste.

Antwort

0

Die range() Funktion nimmt einen dritten step Parameter:

>>> for i in range(0,15,3): 
>>>  print(i) 
... 
... 0 
3 
6 
9 
12 

Sie, dass wie im unteren Teil Ihres Tupel verwenden können, und fügen Sie k oder k-1 den oberen Teil zu bekommen.

list_of_tuples = [] 
for i in range(0,n,k): 
    list_of_tuples.append(tuple(i, i+k-1)) 

Sie können dies umkehren mit einem Verständnis, wenn Sie mögen:

lot = [ (i,i+k) for i in range(0,n,k) ] 

(Nicht eine Subtraktion ist eine gute Idee, wenn Sie diese Zahlen in eine range() füttern fahren.)

0
>>> def gen_include_n(n, k): 
...  a = zip(range(0, n + 1, k), range(k - 1, n + k, k)) 
...  a[-1] = (a[-1][0], min(n, a[-1][1])) 
...  return a 
... 
>>> gen_include_n(10,1) 
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)] 
>>> gen_include_n(10,2) 
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9), (10, 10)] 
>>> gen_include_n(10,6) 
[(0, 5), (6, 10)] 
>>> gen_include_n(10,10) 
[(0, 9), (10, 10)] 
>>> gen_include_n(10,11) 
[(0, 10)] 

>>> def gen_exclude_n(n, k): 
...  a = zip(range(0, n, k), range(k - 1, n + k - 1, k)) 
...  a[-1] = (a[-1][0], min(n - 1, a[-1][1])) 
...  return a 
... 
>>> gen_exclude_n(10,1) 
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)] 
>>> gen_exclude_n(10,2) 
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)] 
>>> gen_exclude_n(10,6) 
[(0, 5), (6, 9)] 
>>> gen_exclude_n(10,10) 
[(0, 9)] 
>>> gen_exclude_n(10,11) 
[(0, 9)]