Fwd: [Tutor] Create list of IPs

Kent Johnson kent37 at tds.net
Sun Feb 20 13:53:47 CET 2005


Liam Clarke wrote:
> Hi, you could save yourself some hassle and do
> 
> 
>>>>minipstr = '1.0.0.1'
>>>>maxipstr = '1.0.15.16'
>>>>
>>>>minip = map(int, minipstr.split('.'))
>>>>maxip = map(int, maxipstr.split('.'))
>>>>
>>>>iplist = []
>>>>
>>>>for a in range(minip[2], maxip[2]+1):
> 
> ...     if a < maxip[2]:
> ...             for b in range(minip[3], 255):
> ...                     iplist.append('.'.join(map(str,
> [minip[0],minip[1], a, b])))
> ...     else:
> ...             for b in range(minip[3], minip[3]+1):
> ...                     iplist.append('.'.join(map(str,
> [minip[0],minip[1], a, b])))
> 
> Eek, that's a bit Perlish, might want to break the iplist.append line into
> 
> ipintlist =  [minip[0],minip[1], a, b]
> ipstrlist = map(str, ipintlist)
> iplist.append('.'.join(ipstrlist))

I don't think this will work correctly with for example
minipstr = '1.0.0.1'
maxipstr = '1.2.0.0'

I would break this problem up conceptually. It has maybe four different parts:
- convert a string representation of an IP address to a useful representation. Liam shows how to do 
this above, a list of ints is easy to work with.
- convert the useful representation back to a string. Again, Liam shows how to do this.
- compare two IPs. If the IPs are represented as lists of ints, you can compare them directly:
  >>> a=[1,2,1,5]
  >>> b=[1,2,3,4]
  >>> a>b
False
  >>> a<b
True
  >>> a==[1,2,1,5]
True

- increment an IP. This is the hardest part. You have to implement a counter that works with the 
list representation. Here is one way to do it - this function does the right thing with the last 
'digit', then if there was a carry it calls itself recursively to increment the next digit. It rolls 
over from [255, 255, 255, 255] to [0, 0, 0, 0]:

def incr(n, limit, ix=None):
   ''' Increment a number base (limit+1) represented as a list of ints '''
   if ix is None:    # initial call starts at the end
     ix = len(n) - 1
   if ix < 0:        # Off the end, give up
     return
   if n[ix] < limit: # Normal increment
     n[ix] += 1
   else:             # Increment with carry
     n[ix] = 0
     incr(n, limit, ix-1)


a=[1,2,1,5]
incr(a, 255)
print a

a=[1,2,1,255]
incr(a, 255)
print a

a=[1,2,255,255]
incr(a, 255)
print a

a=[1,255,255,255]
incr(a, 255)
print a

a=[255,255, 255,255]
incr(a, 255)
print a

## prints
[1, 2, 1, 6]
[1, 2, 2, 0]
[1, 3, 0, 0]
[2, 0, 0, 0]
[0, 0, 0, 0]

Kent



More information about the Tutor mailing list