2017-07-15 3 views
-3

J'ai le nombre total d'éléments dans la gamme N et un certain nombre de morceaux nbLa meilleure façon de séparer gamme dans les gammes n égales en Python

Je veux diviser N en nb meilleures plages égales possibles, avec juste la numéro de départ et le numéro de fin. Ainsi, par exemple, N=24 et nb=5 en sortie:

0,5 5,10 10,15 15,20 20,24 

Alors que N=28 et nb=5 devrait sortie:

0,5 5,10 10,16 16,22 22,28 (the rest of `N/nb` division is equally distributed on the 3 last subranges) 

Basé sur un commentaire, j'ai cette méthode:

def partition(lst, n): 
    division = len(lst)/n 
    return [lst[round(division * i):round(division * (i + 1))] for i in range(n)] 

def ranges(N, nb): 
    return ["{},{}".format(r.start, r.stop) for r in partition(range(N), nb)] 

>>> ranges(28, 5) 
['0,6', '6,11', '11,17', '17,22', '22,28'] 

est-il une meilleure façon de le faire?

+1

Ceci est quelque peu similaire à cette question: https://stackoverflow.com/q/2659900/270986 –

Répondre

0

Il est certainement plus simple de calculer le démarrage et l'arrêt des numéros directement plutôt que de trancher un objet range pour les obtenir:

def ranges(N, nb): 
    step = N/nb 
    return ["{},{}".format(round(step*i), round(step*(i+1))) for i in range(nb)] 

Ce n'est pas autant plus efficace que votre code qu'il pourrait regarder parce que trancher un range l'objet ne prend que O(1), donc votre code existant est déjà asymptotiquement optimal. Ma version améliore probablement la performance par un facteur constant, mais il peut être petit. Je pense que ma version est également beaucoup plus claire, ce qui peut être plus important que n'importe quel changement de performance.