Skip to content Skip to sidebar Skip to footer

Pair Ip Addresses In A List Pulled From Xlrd

I have used xlrd to pull data from a column (Data Below). I need to group together the ip addressess. So ip address that appear next together in the output belong to the same pool

Solution 1:

ip_data = ['', '', '', '', '', '', '', 'Pool Member IP', '', '10.100.33.184 (S56723FR6VL01)', '10.100.33.183 (S56723FR6VL02)', '', '', '', '', '', '', '', '10.101.33.182 (S56723FR6VL03)', '10.100.33.181 (S56723FR6VL04)', '', '', '', '', '', '', '', '10.100.33.180 (S56723FR6VL05)', '10.100.33.179 (S56723FR6VL06)', '', '', '', '', '', '', '', '10.100.33.178 (S56723FR6VL07)', '10.100.33.177 (S56723FR6VL08)', '', '', '', '', '', '', '', '10.100.33.90 (S56723FR6VL09)', '', '', '', '', '', '', '', '', '10.100.33.89 (S56723FR6VL0A)', '', '', '', '', '', '', '', '', '10.100.33.91 (S56723FR6VW01)', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
ip_pools = [[]]  # it starts as a list with an empty list at its last (and only) indexfor ip_address in ip_data[ip_data.index('Pool Member IP')+1:]:
    if not ip_address:  # ip_address is ''if ip_pools[-1]:  # the last element of ip_pools is NOT an empty list: []
            ip_pools.append([])  # for the next ip poolelse:  # ip_address is not empty# ip_pools[-1].append(ip_address)  # if you need the whole text
        ip_pools[-1].append(ip_address.partition(' ')[0])  # if you just want the numberif [] in ip_pools:
    ip_pools.remove([])  # to remove last empty list (if exists)

EDIT: Corrected the for sentence

Solution 2:

@franciscosollima's solution is good. Here's another way with regex.

iplist = ['', '', '', '', '', '', '', 'Pool Member IP', '', '10.100.33.184 (S56723FR6VL01)', '10.100.33.183 (S56723FR6VL02)', '', '', '', '', '', '', '', '10.101.33.182 (S56723FR6VL03)', '10.100.33.181 (S56723FR6VL04)', '', '', '', '', '', '', '', '10.100.33.180 (S56723FR6VL05)', '10.100.33.179 (S56723FR6VL06)', '', '', '', '', '', '', '', '10.100.33.178 (S56723FR6VL07)', '10.100.33.177 (S56723FR6VL08)', '', '', '', '', '', '', '', '10.100.33.90 (S56723FR6VL09)', '', '', '', '', '', '', '', '', '10.100.33.89 (S56723FR6VL0A)', '', '', '', '', '', '', '', '', '10.100.33.91 (S56723FR6VW01)', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']

import re

p = re.compile('[\d]+(?:\.[\d]+){3}')

pools = [[]]for ip in iplist:
    m = p.match(ip)
    if m:
        pools[-1].append(m.group(0))
    elif not pools[-1]:
        continue
    else:
        pools.append([])

if [] in pools:
    pools.remove([])

for i, p in enumerate(pools, 1):
    print("Group " + str(i) +": " + str(p))

It's as simple as adding consecutive matches to the same pool. Otherwise, initialise a new one. The regex pattern will match from the start, and you may configure it detect IPv6 addresses too.

Prints out:

Group1: ['10.100.33.184', '10.100.33.183']Group2: ['10.101.33.182', '10.100.33.181']Group3: ['10.100.33.180', '10.100.33.179']Group4: ['10.100.33.178', '10.100.33.177']Group5: ['10.100.33.90']Group6: ['10.100.33.89']Group7: ['10.100.33.91']

Solution 3:

ips = [ip.split()[0] for ip in data if ip[0].isdigit()]
sort = sorted(ips, key= lambda ip: int(ip.split('.')[-1]))
i, l, c = 0, len(sort), 1
pools = {}
while i < l:
    ifint(sort[i].split('.')[-1]) == int(sort[i+1]).split('.')[-1])-1:
        pools[c] = (sort[i], sort[i+1])
        i += 2else:
        pools[c] = (sort[i],)
        i += 1
    c += 1

Solution 4:

May i play a bit with itertools for an answer?

test = ['', '', '', '', '', '', '', 'Pool Member IP', '', '10.100.33.184 (S56723FR6VL01)', '10.100.33.183 (S56723FR6VL02)', '', '', '', '', '', '', '', '10.101.33.182 (S56723FR6VL03)', '10.100.33.181 (S56723FR6VL04)', '', '', '', '', '', '', '', '10.100.33.180 (S56723FR6VL05)', '10.100.33.179 (S56723FR6VL06)', '', '', '', '', '', '', '', '10.100.33.178 (S56723FR6VL07)', '10.100.33.177 (S56723FR6VL08)', '', '', '', '', '', '', '', '10.100.33.90 (S56723FR6VL09)', '', '', '', '', '', '', '', '', '10.100.33.89 (S56723FR6VL0A)', '', '', '', '', '', '', '', '', '10.100.33.91 (S56723FR6VW01)', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
import itertools
defisplit(iterable,splitters):
    return [list(g) for k,g in itertools.groupby(iterable,lambda x:x in splitters) ifnot k]
test.remove('Pool Member IP')
pool = 0forlistin isplit(test,''):
    iflen(list):
        pool+=1print(pool, list)

Prints out:

1['10.100.33.184 (S56723FR6VL01)', '10.100.33.183 (S56723FR6VL02)']2['10.101.33.182 (S56723FR6VL03)', '10.100.33.181 (S56723FR6VL04)']3['10.100.33.180 (S56723FR6VL05)', '10.100.33.179 (S56723FR6VL06)']4['10.100.33.178 (S56723FR6VL07)', '10.100.33.177 (S56723FR6VL08)']5['10.100.33.90 (S56723FR6VL09)']6['10.100.33.89 (S56723FR6VL0A)']7['10.100.33.91 (S56723FR6VW01)']

Kudos to Split a list into nested lists on a value and google-fu

Post a Comment for "Pair Ip Addresses In A List Pulled From Xlrd"