loop over list and process into groups

Chris Colbert sccolbert at gmail.com
Thu Mar 4 22:00:02 CET 2010


Man, deja-vu, I could have sworn I read this thread months ago...

On Thu, Mar 4, 2010 at 2:18 PM, nn <pruebauno at latinmail.com> wrote:

>
>
> lbolla wrote:
> > On Mar 4, 3:57 pm, Sneaky Wombat <joe.hr... at 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20100304/173d1baa/attachment.html>


More information about the Python-list mailing list