J'ai une fonction sumranges() qui résume toutes les plages de nombres consécutifs trouvés dans un couple de tuples. Pour illustrer:Sommation de plages consécutives Pythoniquement
def sumranges(nums):
return sum([sum([1 for j in range(len(nums[i])) if
nums[i][j] == 0 or
nums[i][j - 1] + 1 != nums[i][j]]) for
i in range(len(nums))])
>>> nums = ((1, 2, 3, 4), (1, 5, 6), (19, 20, 24, 29, 400))
>>> print sumranges(nums)
7
Comme vous pouvez le voir, il renvoie le nombre de gammes de chiffres consécutifs au sein de l'uplet, soit: len ((1, 2, 3, 4), (1), (5, 6), (19, 20), (24), (29), (400)) = 7. Les tuples sont toujours ordonnés.
Mon problème est que mon sumranges() est terrible. Je déteste le regarder. Je suis actuellement en train d'itérer à travers le tuple et chaque sous-groupe, en assignant un 1 si le nombre n'est pas (1 + numéro précédent), et en additionnant le total. J'ai l'impression qu'il me manque un moyen beaucoup plus facile d'atteindre mon objectif déclaré. Est-ce que quelqu'un sait une façon plus pythonique de le faire?
Edit: J'ai comparé toutes les réponses données jusqu'ici. Merci à vous tous pour vos réponses.
Le code d'étalonnage est la suivante, en utilisant une taille d'échantillon de 100K:
from time import time
from random import randrange
nums = [sorted(list(set(randrange(1, 10) for i in range(10)))) for
j in range(100000)]
for func in sumranges, alex, matt, redglyph, ephemient, ferdinand:
start = time()
result = func(nums)
end = time()
print ', '.join([func.__name__, str(result), str(end - start) + ' s'])
Les résultats sont les suivants. Réponse réelle montré pour vérifier que toutes les fonctions renvoient la bonne réponse:
sumranges, 250281, 0.54171204567 s
alex, 250281, 0.531121015549 s
matt, 250281, 0.843333005905 s
redglyph, 250281, 0.366822004318 s
ephemient, 250281, 0.805964946747 s
ferdinand, 250281, 0.405596971512 s
RedGlyph n'edge en termes de vitesse, mais la réponse la plus simple est probablement Ferdinand, et gagne probablement pour la plupart pythonique.
C'est vraiment lisse. –
Ah, j'avais raté le bit "tuples sont toujours ordonnés" dans la question - ce bit _does_ rend cette réponse préférable (la mienne fonctionnerait pour des tuples arbitraires, pas seulement des tuples ordonnés, mais, il y a un petit prix à payer pour ça généralité). –