Tengo una función sumranges(), que suma todos los rangos de números consecutivos encontrados en una tupla de tuplas. Para ilustrar:Sumar rangos consecutivos Pythonically
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
Como se puede ver, devuelve el número de rangos de dígitos consecutivos dentro de la tupla, es decir: len ((1, 2, 3, 4), (1), (5, 6), (19, 20), (24), (29), (400)) = 7. Las tuplas siempre están ordenadas.
Mi problema es que mi sumranges() es terrible. Odio mirarlo. Actualmente solo estoy iterando a través de la tupla y cada subtítulo, asignando un 1 si el número no es (1 + número anterior) y sumando el total. Siento que me falta una manera mucho más fácil de lograr mi objetivo declarado. ¿Alguien sabe una forma más pitonica de hacer esto?
Editar: He analizado todas las respuestas dadas hasta el momento. Gracias a todos por sus respuestas.
El código de evaluación comparativa es como sigue, utilizando un tamaño de muestra de 100 K:
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'])
Los resultados son como sigue. respuesta real se muestra para verificar que todas las funciones devuelven la respuesta correcta:
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 no borde en términos de velocidad, pero la respuesta más sencilla es probablemente de Fernando, y probablemente para la mayoría gana Pythonic.
Eso es realmente astuto. –
Ah, me había perdido las "tuplas siempre se ordenan" poco en la pregunta, ese bit _desea_ hace que esta respuesta sea preferible (la mía funcionaría para las tuplas arbitrarias, no solo las ordenadas, pero hay un pequeño precio que pagar por eso generalidad). –