Nov-22-2018, 12:29 PM
(This post was last modified: Nov-22-2018, 12:29 PM by Gribouillis.)
Itertools can help for this task
import io import itertools as itt def make_ranges(ints): ii = iter(sorted(ints)) a = b = next(ii) for k in ii: if k == b + 1: b = k else: yield a, b a = b = k yield a, b p = ['Eth1/1', 'Eth1/48','Eth2/1', 'Eth2/4','Eth101/1/1', 'Eth101/1/16', 'Eth101/1/3','Eth102/1/1', 'Eth102/1/2', 'Eth102/1/3','Eth103/1/1', 'Eth103/1/2', 'Eth103/1/3','Eth103/1/4','Eth104/1/1', 'Eth104/1/2', 'Eth104/1/3','Eth104/1/4'] p = [x.split('/') for x in p] p = [(x[0],) + tuple(int(y) for y in x[1:]) for x in p] q, r = [sorted(g) for k, g in itt.groupby(sorted(p, key=len), key=len)] fw1 = io.StringIO() for rec in q: print('/'.join(str(x) for x in rec), file=fw1) fw2 = io.StringIO() for k, g in itt.groupby(r, key=lambda x: x[:-1]): for a, b in make_ranges(int(x[-1]) for x in g): kk = k + (a if a == b else '{}-{}'.format(a, b),) print('/'.join(str(x) for x in kk), file=fw2) print(fw1.getvalue()) print(fw2.getvalue())
Output:Eth1/1
Eth1/48
Eth2/1
Eth2/4
Eth101/1/1
Eth101/1/3
Eth101/1/16
Eth102/1/1-3
Eth103/1/1-4
Eth104/1/1-4