2017-06-20 3 views
-2

Was ist der effizienteste und zuverlässigste Weg in Python Sektoren wie folgt aufteilen:Split ganze Zahl in gleiche Stücke

Nummer: 101 (kann natürlich variieren) chunk1: 1 bis 30 chunk2: 31-61 chunk3: 62-92 chunk4: 93-101

Fluss: Kopie Sektor 1 bis 30 überspringen Sektoren in chunk 1 und kopiert 30 Sektoren von Sektor beginnend 31 und so weiter ...

Ich habe das "manuell" gelöst mit Modulen und Grundrechenarten, aber dafür muss es eine Funktion geben?

Vielen Dank.

Antwort

1

Ich nehme an, dass Sie Nummer in einem Listenformat haben werden. Also, in diesem Fall, wenn Sie ein sehr spezifisches Format des Clusters der Zahlensequenz wünschen und wissen, wo es sich trennen soll, dann ist die Verwendung der Indexierung der beste Weg, da es weniger Zeitkomplexität haben wird. Sie können also immer einen kleinen Code erstellen und ihn zu einer Funktion machen, die Sie wiederholt verwenden möchten. So etwas wie unten:

def sectors(num_seq,chunk_size=30): 
    ...:  import numpy as np 
    ...:  sectors = int(np.ceil(len(num_seq)/float(chunk_size))) #create number of sectors 
    ...:  for i in range(sectors): 
    ...:   if i < (sectors - 1): 
    ...:    print num_seq[(chunk_size*i):(chunk_size*(i+1))] #All will chunk equal size except the last one. 
    ...:   else: 
    ...:    print num_seq[(chunk_size*i):] #Takes rest at the end. 

Jetzt wollen jedes Mal, wenn ähnlich, was Sie es wieder verwenden können und es ist effizient, wie Sie die Liste Indexwert definieren, anstatt durch sie zu suchen. Hier

ist die Ausgabe:

x = range(1,101) 
print sectors(x) 
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30] 
    [31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60] 
    [61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90] 
    [91, 92, 93, 94, 95, 96, 97, 98, 99, 100] 

Bitte lassen Sie mich wissen, ob dies Ihre Anforderung erfüllt.

+0

Thank you! Numpy hat den Job gemacht. – user3323307

1

Einfache und schnelle (einzelne Iteration):

>>> input = range(1, 102) 
>>> n = 30 
>>> output = [input[i:i+n] for i in range(0, len(input), n)] 
>>> output 
[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], [31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60], [61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90], [91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101]] 

Eine weitere sehr einfache und umfassende Weise:

>>> f = lambda x,y: [ x[i:i+y] for i in range(0,len(x),y)] 
>>> f(range(1, 102), 30) 
[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], [31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60], [61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90], [91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101]] 
1

Sie können versuchen, numpy.histogram zu verwenden, wenn Sie suchen eine Zahl in spucken gleich große Behälter (Sektoren).

Dies wird eine Reihe von Zahlen erstellen, jedes Fach Grenze abgrenzt:

import numpy as np 

number = 101 
values = np.arange(number, dtype=int) 
bins = np.histogram(values, bins='auto') 
print(bins) 
Verwandte Themen