lbolla wrote: > On Mar 4, 3:57 pm, Sneaky Wombat <joe.hr...@gmail.com> wrote: > > [ {'vlan_or_intf': 'VLAN2021'}, > > {'vlan_or_intf': 'Interface'}, > > {'vlan_or_intf': 'Po1'}, > > {'vlan_or_intf': 'Po306'}, > > {'vlan_or_intf': 'VLAN2022'}, > > {'vlan_or_intf': 'Interface'}, > > {'vlan_or_intf': 'Gi7/33'}, > > {'vlan_or_intf': 'Po1'}, > > {'vlan_or_intf': 'Po306'}, > > {'vlan_or_intf': 'VLAN2051'}, > > {'vlan_or_intf': 'Interface'}, > > {'vlan_or_intf': 'Gi9/6'}, > > {'vlan_or_intf': 'VLAN2052'}, > > {'vlan_or_intf': 'Interface'}, > > {'vlan_or_intf': 'Gi9/6'},] > > > > I want it to be converted to: > > > > [{'2021':['Po1','Po306']},{'2022':['Gi7/33','Po1','Po306']},etc etc] > > > > I was going to write a def to loop through and look for certain pre- > > compiled regexs, and then put them in a new dictionary and append to a > > list, but I'm having trouble thinking of a good way to capture each > > dictionary. Each dictionary will have a key that is the vlan and the > > value will be a list of interfaces that participate in that vlan. > > Each list will be variable, many containing only one interface and > > some containing many interfaces. > > > > I thought about using itertools, but i only use that for fixed data. > > I don't know of a good way to loop over variably sized data. I was > > wondering if anyone had any ideas about a good way to convert this > > list or dictionary into the right format that I need. The solution I > > come up with will most likely be ugly and error prone, so I thought > > i'd ask this python list while I work. Hopefully I learn a better way > > to solve this problem. > > > > Thanks! > > > > I also have the data in a list, > > > > [ 'VLAN4065', > > 'Interface', > > 'Gi9/6', > > 'Po2', > > 'Po3', > > 'Po306', > > 'VLAN4068', > > 'Interface', > > 'Gi9/6', > > 'VLAN4069', > > 'Interface', > > 'Gi9/6',] > > > > =================================== > > from itertools import groupby > > data = \ > [ {'vlan_or_intf': 'VLAN2021'}, > {'vlan_or_intf': 'Interface'}, > {'vlan_or_intf': 'Po1'}, > {'vlan_or_intf': 'Po306'}, > {'vlan_or_intf': 'VLAN2022'}, > {'vlan_or_intf': 'Interface'}, > {'vlan_or_intf': 'Gi7/33'}, > {'vlan_or_intf': 'Po1'}, > {'vlan_or_intf': 'Po306'}, > {'vlan_or_intf': 'VLAN2051'}, > {'vlan_or_intf': 'Interface'}, > {'vlan_or_intf': 'Gi9/6'}, > {'vlan_or_intf': 'VLAN2052'}, > {'vlan_or_intf': 'Interface'}, > {'vlan_or_intf': 'Gi9/6'},] > > def clean_up(lst): > return [d.values()[0] for d in data if d.values()[0] != 'Interface'] > > out = {} > for k, g in groupby(clean_up(data) , key=lambda s: > s.startswith('VLAN')): > if k: > key = list(g)[0].replace('VLAN','') > else: > out[key] = list(g) > > print out > =================================== > > hth, > L.
Good use of groupby. Here is what I ended up coming up: from itertools import groupby laninfo=[ 'VLAN4065', 'Interface', 'Gi9/6', 'Po2', 'Po3', 'Po306', 'VLAN4068', 'Interface', 'Gi9/6', 'VLAN4069', 'Interface', 'Gi9/6',] def splitgrp(s, f=[False]): f[0]^=s.startswith('VLAN') return f[0] lanlst=(list(g) for k,g in groupby(laninfo,key=splitgrp)) out={item[0][4:]:item[2:] for item in lanlst} print(out) -- http://mail.python.org/mailman/listinfo/python-list