# [Tutor] numbers and ranges

Kent Johnson kent37 at tds.net
Sun May 27 22:33:05 CEST 2007

```Jon Crump wrote:
> Dear all,
>
> Here's a puzzle that should be simple, but I'm so used to words that
> numbers tend to baffle me.
>
> I've got fields that look something like this:
> 1942. Oct. 1,3,5,7,8,9,10
>
> I need to parse them to obtain something like this:
> <sometag start="1942-10-01"/>
> <sometag start="1942-10-03"/>
> <sometag start="1942-10-05"/>
> <sometag start="1942-10-07" end "1942-10-10"/>
>
> The xml representation is incidental, the basic problem is how to test a
> list of integers to see if they contain a range, and if they do, do
> something different with them.

Here is a solution that uses a generator to create the ranges:

def ranges(data):
i = iter(data)
first = last = i.next()
try:
while 1:
next = i.next()
if next > last+1:
yield (first, last)
first = last = next
else:
last = next
except StopIteration:
yield (first, last)

print list(ranges((1,)))
print list(ranges((1,2,3)))
print list(ranges((1,3,5)))
print list(ranges((1,3,5,7,8,9,10)))

for start, end in ranges((1,3,5,7,8,9,10)):
if start == end:
print '<sometag start="1942-10-%02d"/>' % start
else:
print '<sometag start="1942-10-%02d" end "1942-10-%02d"/>' %
(start, end)

Kent
```

More information about the Tutor mailing list