Need help with getting Key, Value out of dicts in lists

Kenton Brede kbrede at gmail.com
Sun Apr 9 17:21:47 EDT 2017


Thanks for the response Irv.  On one level I'm glad to know that someone
more knowledgeable than myself sees this data structure as difficult. :)  I
was thinking it was an easy problem to solve.  Unfortunately that is the
structure I have to use.

The data comes from pulling back tag information on AWS load balancers.  So
each list within the overall parent list are tags from one load balancer.
Each dict pair inside the inner lists, is one tag.  To simplify, below is a
representation of one load balancer and two tags.  The parent list contains
multiple inner lists, each for a single load balancer.

[
    [
        {
            "Value": "20176783-181622543367489",
            "Key": "Resource_group_id"
        },
        {
            "Value": "shibboleth-prd-alb",
            "Key": "Name"
        }
    ],
]

I have an ugly solution of 'for loops' and 'if statements' that works,
which uses a different path to get to the information.  I was just hoping
to be more direct by matching the 'Value' of  'Key: Resource_group_id' and
pull back the 'Value' of 'Key: Name' and other tags as needed.

Thanks,

Kenton Brede





On Sat, Apr 8, 2017 at 11:29 PM, Irv Kalb <Irv at furrypants.com> wrote:

> [ Sorry, forgot the important stuff! ]
>
> What you want to do is tricky because your data structure is difficult to
> deal with.  My guess is that it has to do with a misconception about how a
> Python dictionary works. Yes, it is a series of key/value pairs, but not
> the way you have it.   It looks like you put together dictionaries where
> each dictionary has a 'Value' and a 'Key'.
>
> Instead, _each_ item in a dictionary is a key value pair. The key is
> typically a string, and the value is obviously some value associated with
> that key.  For example, if you have the ability to rebuild your data a
> different way, it looks like it would be better to deal with it something
> like this:
>
> aList = [
>            {'Name':'shibboleth-prd', 'Billing':'kmvu',
> 'Resource_group_id': '20179204-181622543367489'},
>            {'Name':'shibboleth-tst', 'Resource_group_id':'20172857-
> 152037106154311'}
>            ]
>
> This is a list of dictionaries.  However, I'm not sure what you are trying
> to do with this data.  I'm guessing that you want to match a resource group
> id, and if you find it, print the name and the billing info if they exist.
> If so, you may want something like this (untested):
>
> def printInfo(thisGroupID):
>    for thisDict in aList:    # loop through all dictionaries in the list
>         if thisGroupID == aList['Resource_group_id']:
>            if 'Name' in thisDict:   # if thisDict has a key called 'Name'
>                print ('Name is', thisDict['Dict'])
>            if 'Billing' in thisDict:   #  if thisDict has a key called
> 'Billing'
>                print ('Billing is', thisDict['Billing'])
>
> Hope this helps,
>
> Irv
> > On Apr 8, 2017, at 9:04 PM, Irv Kalb <Irv at furrypants.com> wrote:
> >
> > What you want to do is tricky because your data structure is difficult
> to deal with.  My guess is that it has to do with a misconception about how
> a Python dictionary works. Yes, it is a series of key/value pairs, but not
> the way you have it.   It looks like you put together dictionaries where
> each dictionary has a 'Value' and a 'Key'.
> >
> > Instead, _each_ item in a dictionary is a key value pair. The key is
> typically a string, and the value is obviously some value associated with
> that key.  For example, if you have the ability to rebuild your data a
> different way, it looks like it would be better to deal with it something
> like this:
> >
> > aList = [
> >            {'Name':'shibboleth-prd', 'Billing':'kmvu',
> 'Resource_group_id': '20179204-181622543367489'},
> >            {'Name':'shibboleth-tst', 'Resource_group_id':'20172857-
> 152037106154311'}
> >            ]
> >
> > This is a list of dictionaries.  However, I'm not sure what you are
> trying to do with this data.  I'm guessing that you want to match a
> resource group id, and if you find it, print the name and the billing info
> if they exist.  If so, you may want something like this (untested):
> >
> > def printInfo(thisGroupID):
> >    for thisDict in aList:    # loop through all dictionaries in the list
> >       if thisGroupID == aList['Resource_group_id']:
> >            if 'Name' in thisDict:   # if thisDict has a key called 'Name'
> >                print ('Name is', thisDict['Dict'])
> >            if 'Billing' in thisDict:   #  if thisDict has a key called
> 'Billing'
> >                print ('Billing is', thisDict['Billing'])
> >
> > Hope this helps,
> >
> > Irv
> >
> >
> >
> >> On Apr 8, 2017, at 5:55 PM, Kenton Brede <kbrede at gmail.com> wrote:
> >>
> >> This is an example of the data I'm working with.  The key/value pairs
> may
> >> come in any order. There are some keys like the 'Resource_group_id' key
> and
> >> the 'Name' key which will always be present, but other lists may have
> >> unique keys.
> >>
> >> alist = [[{u'Value': 'shibboleth-prd', u'Key': 'Name'}, {u'Value':
> 'kvmu',
> >> u'Key': 'Billing'},
> >>           {u'Value': '20179204-181622543367489', u'Key':
> >> 'Resource_group_id'}],
> >>          [{u'Value': '20172857-152037106154311', u'Key':
> >> 'Resource_group_id'},
> >>           {u'Value': 'shibboleth-tst', u'Key': 'Name'}]]
> >>
> >> What I want to do is something along the lines of:
> >>
> >> for a in alist:
> >>   if a['Resource_group_id'] == '01234829-2041523815431':
> >>       print the Value of 'Name'
> >>       print the Value of 'Billing'
> >>
> >> I've found I can do the following, to print the value of 'Name' but that
> >> only works if the 'Resource_group_id' key is the first key in the list
> and
> >> the 'Name' key is in the second slot.  If each list contained the same
> >> keys, I could probably sort the keys and use [num] to pull back values,
> but
> >> they don't.
> >>
> >> for a in alist:
> >>   if a[0]['Key'] == 'Resource_group_id' and a[0]['Value'] ==
> >> '20172857-152037106154311':
> >>       print a[1]['Value']
> >>
> >> There has to be a way to do this but I've been pounding away at this for
> >> hours.  Any help appreciated.  I'm new to Python and not a programmer,
> so
> >> go easy on me. :)
> >> --
> >> https://mail.python.org/mailman/listinfo/python-list
> >>
> >
>
> --
> https://mail.python.org/mailman/listinfo/python-list
>


More information about the Python-list mailing list