Summing Consecutive Ranges Pythonically
<p>I have a sumranges() function, which sums all the ranges of consecutive numbers found in a tuple of tuples. To illustrate:</p>

<pre><code>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))])

&gt;&gt;&gt; nums = ((1, 2, 3, 4), (1, 5, 6), (19, 20, 24, 29, 400))
&gt;&gt;&gt; print sumranges(nums)
7
</code></pre>

<p>As you can see, it returns the number of ranges of consecutive digits within the tuple, that is: len((1, 2, 3, 4), (1), (5, 6), (19, 20), (24), (29), (400)) = 7. The tuples are always ordered.</p>

<p>My problem is that my sumranges() is terrible. I hate looking at it. I'm currently just iterating through the tuple and each subtuple, assigning a 1 if the number is not (1 + previous number), and summing the total. I feel like I am missing a much easier way to accomplish my stated objective. Does anyone know a more pythonic way to do this?</p>

<p>Edit: I have benchmarked all the answers given thus far. Thanks to all of you for your answers.</p>

<p>The benchmarking code is as follows, using a sample size of 100K:</p>

<pre><code>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'])
</code></pre>

<p>Results are as follows. Actual answer shown to verify that all functions return the correct answer:</p>

<pre><code>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
</code></pre>

<p>RedGlyph does edge out in terms of speed, but the simplest answer is probably Ferdinand's, and probably wins for most pythonic.</p>
